Python Web自动化:模拟键盘操作指南
1.Web 元素交互
五种常⽤的操作
1. 点击 (适⽤于任何元素)
driver.find_element(By.XPATH, "//*[@id='btnSearch']").click() # 点击登陆按钮
2发送键位 (仅适⽤于⽂本字段和内容可编辑元素)
driver.find_element(By.XPATH, "//input[@name='searchKey']").send_keys("⼤王"+ Keys.ENTER)
我们使用send_keys输入内容,再然后通过Key.(键盘上的值)来模拟按键
3清除 (仅适⽤于⽂本字段和内容可编辑元素)
el = driver.find_element(By.XPATH, "//input[@name='searchKey']")
el.send_keys("⼤王")
sleep(3)
el.clear()
2.使⽤选择列表元素
导入相关的模块
from selenium.webdriver.support.select import Select
# 创建一个select对象
select_element=driver.find_element(By.NAME,"singleSelect")
select_object=Select(select_element)
我们有如下的网页
有三种方法选择元素的方法
1)根据索引进⾏选择:
select_object.select_by_index(2)
2)通过value值进⾏选择:
# 2.根据value的值
select_object.select_by_value("option2")
3.通过元素的⽂本内容进⾏选择:
# 3通过元素的⽂本内容进⾏选择:
select_object.select_by_visible_text("选项1")
获取所有可选择的选项(all_selected_options):
# 获取已选择的选项
selected_option=select_object.all_selected_options
print("获取已选择的选项:"+selected_option)
获取可选择项的第⼀个(first_selected_option):
first_selected_option = select_object.first_selected_option
多选
""""""
import time
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome()
# 打开项目的url
"""
打开本地化文件`
"""
driver.get("http://localhost:63342/Webtest0524/day4/02%20%E9%80%89%E6%8B%A9%E5%88%97%E8%A1%A8%E5%85%83%E7%B4%A0/%E4%B8%8B%E6%8B%89%E6%A1%86%E7%A4%BA%E4%BE%8B.html?_ijt=sv6udc44f2m0qa7ce4l5q0bjil&_ij_reload=RELOAD_ON_SAVE")
# 触发多选下拉框
driver.find_element(By.XPATH, "//button").click()
# 创建一个多选select对象
select_element = driver.find_element(By.ID, "multiSelect")
selct_object = Select(select_element)
# 确定是否允许多选
check_selects = selct_object.is_multiple
print("是否允许多选: ", check_selects)
# 根据索引
selct_object.select_by_index(3)
# 根据value的值
selct_object.select_by_value('option3')
# 根据文本
selct_object.select_by_visible_text('选项2')
"""
其他操作
"""
# 获取已选择的选项
selected_option = selct_object.all_selected_options
print("获取已选择的选项: ", selected_option)
print(f"已经选择了 {len(selected_option)} 个选项")
# 获取所有可选择的选项
return_all_selects = selct_object.options
print("获取所有可选择的选项: ", return_all_selects)
print(f"总共有 {len(return_all_selects)} 个选项")
# 获取第一个被选择的选项
first_select = selct_object.first_selected_option
print("获取第一个被选择的选项: ", first_select)
# 取消所有被选择的选项
time.sleep(3)
# selct_object.deselect_all()
我们还可以进行反选,逻辑如上图代码
3.Action接⼝
原理: selenium底层提供了很多接⼝,⽤于通过调⽤接⼝来模拟⿏标、键盘等的操作( 遵循的是W3C协议 )
导⼊相关模块:from selenium.webdriver import ActionChains
在使用action接口的时候,我们需要注意前置和后置:
前置:在使⽤Actions对象时,需要传⼊初始化的浏览器对象:
driver = webdriver.Chrome()
ActionChains(driver)
后置:输⼊完所有的操作后,需要通过perform()进⾏提交操作:
ActionChains(driver).move_to_element(el).click_and_hold().send_keys("abc").perform()
又例如:我们让qs大写,dd小写
# key_down(按下)
ActionChains(driver).click(el).key_down(Keys.SHIFT)\
.send_keys("qs").key_up(Keys.SHIFT).send_keys("dd").perform()
释放所有Actions:
ActionBuilder(driver).clear_actions()
如果不释放的话,会默认记住上述的步骤,⽐如:前⾯按了Shift,如果不释放的话,再按其他字⺟就是⼤写,释放了则是⼩写
4.Keyboard actions(键盘事件)
我们有如下例子
""""""
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://120.25.127.201:18001/")
def tt_key_down():
"""验证模拟按下键位"""
el = driver.find_element(By.ID, "searchKey")
ActionChains(driver).click(el).key_down(Keys.SHIFT).send_keys("qs").perform()
# 获取输入的文本信息
text = el.get_attribute("value")
print("获取输入的文本信息: ", text)
assert "QS" == text
print("tt_key_down测试用例的结果通过")
# tt_key_down()
def tt_key_up():
"""验证模拟松开键位"""
el = driver.find_element(By.ID, "searchKey")
ActionChains(driver).click(el).key_down(Keys.SHIFT).send_keys("qs") \
.key_up(Keys.SHIFT).send_keys("dd") \
.perform()
# 获取输入的文本信息
text = el.get_attribute("value")
print("获取输入的文本信息: ", text)
assert "QSdd" == text
print("tt_key_up测试用例的结果通过")
tt_key_up()
我们来进行验证键盘的模拟
5.Mouse actions(⿏标事件)
1) Click and hold (点击并按住不放):
ActionChains(driver) \
.click_and_hold(clickable) \
.perform()
2) Click and release (点击然后松开):
ActionChains(driver) \
.click(clickable) \
.perform()
3) Context Click (单击右键):
ActionChains(driver) \
.context_click(clickable) \
.perform()
4) Back Click (点击后退):
action = ActionBuilder(driver)
action.pointer_action.pointer_down(MouseButton.BACK)
action.pointer_action.pointer_up(MouseButton.BACK)
action.perform()
5) Forward Click (点击前进):
action = ActionBuilder(driver)
action.pointer_action.pointer_down(MouseButton.FORWARD)
action.pointer_action.pointer_up(MouseButton.FORWARD)
action.perform()
6) Double click (双击):
ActionChains(driver) \
.double_click(clickable) \
.perform()
7) Move to element (移动到元素):
ActionChains(driver) \
.move_to_element(hoverable) \
.perform()
8) Drag and Drop on Element (在元素上拖放):
# 在源元素上单击并按住,移动到⽬标元素的位置,然后释放⿏标
draggable = driver.find_element(By.ID, "draggable")
droppable = driver.find_element(By.ID, "droppable")
ActionChains(driver)\
.drag_and_drop(draggable, droppable)\
.perform()
例子如下
""""""
import time
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.actions.mouse_button import MouseButton
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://novel.hctestedu.com/")
el = driver.find_element(By.LINK_TEXT, "重生学霸小甜妻")
# click_and_hold(点击并按住不放)
ActionChains(driver).click_and_hold(el).perform()
time.sleep(3)
# click(点击然后松开)
ActionChains(driver).click(el).perform()
time.sleep(3)
# context_click(点击右键)
ActionChains(driver).context_click(el).perform()
time.sleep(3)
# (点击后退)
# 需要用到另一个类ActionBuilder,需要鼠标支持多功能的操作,实际的工作中是不实用的
ActionBuilder(driver).pointer_action.pointer_down(MouseButton.BACK)
ActionBuilder(driver).pointer_action.pointer_up(MouseButton.BACK)
ActionBuilder(driver).perform()
# 实际的工作中用driver.back()进行浏览器回退
driver.back()
# double_click(双击)
ActionChains(driver).double_click(el).perform()
# move_to_element(移动到元素)
time.sleep(2)
move_el = driver.find_element(By.LINK_TEXT, "百度")
ActionChains(driver).move_to_element(move_el).perform()
# drag_and_drop(在元素上拖放)
# 只有支持拖放的这个功能才可以使用
# 起点元素、终点元素
ActionChains(driver).drag_and_drop('起点元素', '终点元素').perform()
6.滚轮
常⻅的5种使⽤⽅法:\
1) Scroll to element 滚动到元素:
driver = webdriver.Chrome()
driver.get("http://120.25.127.201:18001/")
el = driver.find_element(By.LINK_TEXT, "百度")
# scroll_to_element(滚动到元素)
# ActionChains(driver).scroll_to_element(el).perform()
ActionChains(driver).scroll_from_origin(el).perform()
2) Scroll by given amount 按给定数值滚动:
# scroll_by_amount(按照指定的坐标数值进行滑动[x坐标(正右负左),y坐标(正下负上)])
ActionChains(driver).scroll_by_amount(0, 1000).perform()
3) Scroll from an element by a given amount 基于元素按给定数值滚动:
我们这个方法是移动元素内部的滑动条
# scroll_from_origin(基于元素按照给定的坐标进行定位)
driver.get("E:\Python\pythonProjects\Webtest0524\day4\\05 滚轮\元素内滑动示例.html")
# 先定位可以滑动的元素
el = driver.find_element(By.CLASS_NAME, "scrollable-content")
# 目标元素
target_element = driver.find_element(By.XPATH, "//div[@class='scrollable-content']/p[16]")
# 1.生成一个坐标对象
coordinates_el = ScrollOrigin.from_element(target_element)
print("coordinates_el: ", coordinates_el)
# 2.获取元素里面的x、y坐标
el_x = target_element.rect['x']
print("元素的X坐标: ", el_x)
el_y = int(target_element.rect['y'])
print("元素的Y坐标: ", el_y)
# 3.滑动元素
ActionChains(driver).scroll_from_origin(coordinates_el, el_x, el_y).perform()
作者:秋殇大大