Actions
- 官方文档:https://selenium-python.readthedocs.io/api.html
- ActionChains:执行PC端的鼠标点击、双击、右键、拖拽等事件
- TouchActions:模拟PC和移动端的点击、滑动、拖拽、多点触控等多种手势操作
动作链接ActionChains
- 执行原理:
- 调用ActionChains的方法时,不会立即执行,而是将所有的操作,按顺序存放在—个列里,当你调用
perform()
方法时,队列中的事件会依次执行
- 调用ActionChains的方法时,不会立即执行,而是将所有的操作,按顺序存放在—个列里,当你调用
- 基本用法
- 生成一个动作
action = ActionChains(driver)
- 动作添加方法1
action.方法1
- 动作添加方法2
action.方法2
- 调用
perform()
方法执行(action.perform())
- 生成一个动作
- 具体写法:
- 链式写法:
ActionChains(driver).move_to_element(element).click(element).perform()
- 分布写法:
actions = ActionChains(driver)
actions.move_to_element(element)
actions.click(element)
actions.perform()
- 链式写法:
ActionChains用法一
-
用法一:点击、右键、双击操作
action = ActionChains(driver)
action.click(element)
action.double_click(element)
action.context_click(element)
action.perform()
-
测试案例一:
- 打开页面:http://sahitest.com/demo/clicks.htm
- 分别对按钮'click me' , ' dbl click me ' ,'right click me' ,执行点击、双击、右键操作
-
打印上面展示框中的内容
image.png
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
class TestActionChains:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("http://sahitest.com/demo/clicks.htm")
self.driver.implicitly_wait(3)
def teardown(self):
self.driver.quit()
def test_click(self):
ele_dbl_click = self.driver.find_element(By.CSS_SELECTOR, '[value="dbl click me"]')
ele_click = self.driver.find_element(By.CSS_SELECTOR, '[value="click me"]')
ele_right_click = self.driver.find_element(By.CSS_SELECTOR, '[value="right click me"]')
ele_text = self.driver.find_element(By.CSS_SELECTOR, '[name="t2"]')
# 实例化ActionChains()
action = ActionChains(self.driver)
# 点击
action.click(ele_click)
# 右键
action.context_click(ele_right_click)
# 双击
action.double_click(ele_dbl_click)
# 执行action
action.perform()
print(ele_text.text)
sleep(4)
ActionChains用法二
-
用法二:移动操作
action = ActionChains(driver)
action.move_to_element(element)
action.perform()
-
测试案例二:
- 打开页面:http://www.baidu.com
-
光标移动到百度首页右上角的设置
image.png
def test_move_to(self):
"""
光标移动到百度的设置按钮上
:return:
"""
self.driver.get("http://www.baidu.com")
ele = self.driver.find_element_by_link_text("设置")
action = ActionChains(self.driver)
action.move_to_element(ele)
sleep(3)
ActionChains用法三
-
用法三:拖拽操作
-
action = ActionChains(driver)
- 方法一:
action.drag_and_drop(drag_ele, drop_ele).perform()
- 方法二:
action.click_and_hold(drag_ele).release(drop_ele).perform()
- 方法三:
action.click_and_hold(drag_ele).move_to_element(drop_ele).release().perform()
- 方法一:
-
-
测试案例三:
- 打开页面:http://sahitest.com/demo/dragDropMooTools.htm
-
移动方块到各个item下并释放
image.png
def test_dragdrop(self):
self.driver.get("http://sahitest.com/demo/dragDropMooTools.htm")
drag_ele = self.driver.find_element_by_id('dragger')
drop_list = self.driver.find_elements(By.CSS_SELECTOR, '[class="item"]')
action = ActionChains(self.driver)
# 将方块移动到每个item中并释放
for drop_ele in drop_list:
"""方法一:使用drag_and_drop 方法"""
# sleep(1)
# action.drag_and_drop(drag_ele, drop_ele).perform()
"""方法二:先进行点击并hold住,再释放"""
# action.click_and_hold(drag_ele).release(drop_ele).perform()
"""方法三:先进行点击并hold住,再移动到目的元素上,最后释放"""
action.click_and_hold(drag_ele).move_to_element(drop_ele).release().perform()
sleep(3)
ActionChains用法四
- 用法四:模拟按键操作
- 模拟按键有多种方法,能用win32api来实现,能用SendKeys来实现,也可以用seleniu
m的WebElement对象的send_keys()
方法来实现,这里ActionChains类也提供了几个模拟按
键的方法
- 模拟按键有多种方法,能用win32api来实现,能用SendKeys来实现,也可以用seleniu
- 用法:
Action = ActionChains(driver)
action.send_keys(Keys.BACK_SPACE)
- 或者
action.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL)
action.perform()
- 测试案例四:
- 打开页面:http://sahitest.com/demo/label.htm
- 向usename输入框输入字符
- 将输入的字符使用键盘的
Backspace
删除一个字符
image.png
def test_keys(self):
self.driver.get("http://sahitest.com/demo/label.htm")
ele = self.driver.find_element(By.XPATH, '//*[@type="textbox"][1]')
ele.click() # 首先要将光标移动到输入框
action = ActionChains(self.driver)
action.send_keys("username").pause(1) # 首先输入username,并等待一秒
action.send_keys(Keys.SPACE).pause(1) # 然后输入空格
action.send_keys("Tom").pause(1) # 然后输入Tom
action.send_keys(Keys.BACK_SPACE).pause(1).perform() # 最后删除一个字符
sleep(3)
触摸链接TouchAcitons
- 官方地址:https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html
- 类似于ActionChains,ActionChains只是针对PC端程序鼠标模拟的一系列操作,对H5页面操作时无效,TouchAction可以对h5页面操作,通过TouchAction可以实现点击、滑动
拖拽、多点触控以及模拟手势的各种操作 - 手势控制
-
tap
--- 在指定元素上敲击 -
double_tap
--- 在指定元素上双敲击 -
tap_and_hold
--- 在指定元素上点击但不释放 -
move
--- 手势移动指定偏移(未释放) -
release
--- 释放手势 -
scroll
--- 手势点击并滚动 -
scroll_from_element
--- 从某个元素位置开始手势点击并滚动(向下滑动为负数,向上滑动为正数) -
long_press
--- 长按元素 -
flick
--- 手势滑动 -
flick_element
--- 从某个元素位置开始手势滑动(向上滑动为负数、向下滑动为正数)。Perform执行 -
Perform
--- 执行
-
TouchActions 案例
- 打开Chrome
- 打开URL : http:/ / www.baidu.con
- 向搜索框中输入
selenium测试
通过TouchAction点击搜索框滑动到底部,点击下一页 - 关闭Chrome
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver import TouchActions
class TestTouchAction:
def setup(self):
"""当使用TouchAction时会报错不是w3c的标准命令,可以使用以下解决"""
option = webdriver.ChromeOptions()
option.add_experimental_option('w3c', False)
self.driver = webdriver.Chrome(options=option)
self.driver.maximize_window()
self.driver.implicitly_wait(3)
def teardown(self):
self.driver.quit()
def test_scroll_bottom(self):
self.driver.get("http://www.baidu.com")
ele_input = self.driver.find_element_by_id('kw')
ele_input.send_keys('selenium测试') # 输入框中输入内容
ele_search = self.driver.find_element_by_id('su')
action = TouchActions(self.driver)
action.tap(ele_search).perform() # 点击百度一下进行搜索
action.scroll_from_element(ele_input, 0, 10000).perform() # 完成页面滑动
sleep(2)
self.driver.find_element_by_link_text("下一页 >").click() # 滑动到最下面点击下一页
sleep(1)
if __name__ == '__main__':
pytest.main(['-v', '-s', 'test_TouchAction.py'])
表单操作(与正常元素操作一致)
表单定义
- 什么是表单?
- 表单是一个包含表单元素的区域。
- 表单元素是允许用户在表单中(比如:文本域、下拉列表、单选框、复选框等等)输入
信息的元素。 - 表单使用表单标签(<form>)定义。例如:<form><input / >< / form>
- 操作表单元素步骤:
- 首先要定位到表单元素
- 然后去操作元素(清空、输入或者点击等)
-
表单结构,类似于Excel中的表格
image.png
表单案例
- 打开网页:https://testerhome.com/account/sign_in
- 输入用户名、密码
- 点击记住登录状态
- 点击登录(即提交表单)
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestForm:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_form(self):
self.driver.get("https://testerhome.com/account/sign_in")
self.driver.find_element_by_id('user_login').send_keys("123") # 输入用户名
self.driver.find_element_by_id('user_password').send_keys('password') # 输入密码
self.driver.find_element_by_id('user_remember_me').click() # 点击记住登录状态
self.driver.find_element(By.XPATH, '//*[@name="commit"]').click() # 点击登录即提交表单按钮
sleep(3)
if __name__ == '__main__':
pytest.main(['-v', '-s', 'test_form.py'])
下一节:网页frame与多窗口处理,包括多窗口、多frame下的窗口识别与切换。