前言 本节将介绍如何使用 Selenium 模拟用户输入。
知识点
模拟用户鼠标操作
模拟用户键盘操作
实例:使用 Selenium 进行鼠标操作
实例:使用 Selenium 进行输入框操作
实训:使用 Selenium 模拟用户登录
Selenium Action 接口 Action 接口是用于向 Web 浏览器提供虚拟化设备输入操作的低级接口.
Action 接口提供了构建复杂用户输入的能力。这些操作的组合可以用于执行更复杂的用户行为。
通过 Selenium Action 接口,可以模拟以下操作:
鼠标操作
键盘操作
笔操作(仅 Chrome)
滚轮操作(仅 Chrome)
ActionChains 类 ActionChains
类是 Selenium 中用于执行复杂用户交互行为的工具。它提供了一组方法,允许你构建和执行多步骤的动作序列,包括鼠标和键盘的操作。主要的作用包括:
模拟用户操作: ActionChains
允许你模拟用户在浏览器中的各种操作,如鼠标移动、点击、双击、拖拽等,以及键盘的按键操作。
处理复杂的用户交互场景: 在某些情况下,简单的单一鼠标或键盘事件无法满足需求,需要进行一系列的动作来完成复杂的用户交互,例如鼠标悬停、下拉框选择、右键菜单等。
支持链式调用: ActionChains
的方法可以进行链式调用,使得可以方便地构建复杂的动作序列。这种链式调用的语法风格使得代码更加清晰和易于维护。
以下是一个简单的例子,演示了如何使用 ActionChains
执行鼠标移动和点击操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome() driver.get("https://example.com" ) target_element = driver.find_element(By.XPATH, "//button[@id='my_button']" ) actions = ActionChains(driver) actions.move_to_element(target_element) actions.click() actions.perform()
在这个例子中,ActionChains
的 move_to_element
方法将鼠标移动到目标元素上,然后 click
方法执行鼠标左键点击操作。最后,通过 perform
方法执行整个动作序列。
通过 ActionChains
,你可以实现更复杂的用户交互,例如拖拽、键盘组合操作等,使得你的自动化测试或爬虫脚本更加灵活和强大。
模拟用户鼠标操作 单击操作 1 2 3 4 5 element = driver.find_element(By.XPATH, '//button[@id="myButton"]' ) actions.click(element).perform()
不使用 ActionChains
类,也可以直接使用 click
方法来单击元素:
1 2 3 4 5 element = driver.find_element(By.XPATH, '//button[@id="myButton"]' ) element.click()
双击操作 1 2 3 4 5 element = driver.find_element(By.XPATH, '//div[@id="myDiv"]' ) actions.double_click(element).perform()
右击操作 1 2 3 4 5 element = driver.find_element(By.XPATH, '//span[@class="context-menu-item"]' ) actions.context_click(element).perform()
拖放操作 1 2 3 4 5 6 source_element = driver.find_element(By.XPATH, '//div[@id="source"]' ) target_element = driver.find_element(By.XPATH, '//div[@id="target"]' ) actions.drag_and_drop(source_element, target_element).perform()
悬停操作 1 2 3 4 5 element = driver.find_element(By.XPATH, '//a[@id="hoverLink"]' ) actions.move_to_element(element).perform()
以上是一些常见的鼠标操作示例,更多鼠标操作示例可以参考 Selenium 官方文档 。
模拟用户键盘操作 Selenium 也提供了模拟用户键盘操作的功能,这对于需要在浏览器中输入文本、按下键盘快捷键或执行其他键盘相关操作的场景非常有用。
输入文本 要在输入框中输入文本,可以使用 send_keys
方法。例如:
1 2 3 4 5 input_box = driver.find_element(By.XPATH, "//input[@id='username']" ) input_box.send_keys("your_username" )
在上面的例子中,send_keys
方法用于向输入框中输入文本。你需要替换 "your_username"
为实际的用户名。
模拟特殊键 有时,你可能需要模拟按下特殊键,例如回车键、Tab 键等。这可以通过 Keys
类来实现。例如,模拟按下回车键:
1 2 3 4 from selenium.webdriver.common.keys import Keysinput_box.send_keys(Keys.ENTER)
复合键操作 Selenium 允许执行复合键操作,例如同时按下 Ctrl 键和 C 键。以下是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome() driver.get("https://example.com" ) input_box = driver.find_element(By.XPATH, "//input[@id='myInput']" ) actions = ActionChains(driver) actions.send_keys_to_element(input_box, "your_text" ) actions.key_down(Keys.CONTROL).send_keys('a' ).key_up(Keys.CONTROL) actions.perform()
上述例子中,key_down
方法表示按下某个键,key_up
方法表示释放某个键。在这个例子中,按下 Ctrl 键,然后按下 A 键,最后释放 Ctrl 键,实现了全选文本的效果。
实例:使用 Selenium 进行鼠标操作 下面通过一个实例来演示如何使用 Selenium 进行鼠标操作。
打开配套网页 打开 实例:使用 Selenium 进行鼠标操作
如上图所示,网页提供了 5 个区域,分别对应 悬停
、单击
、双击
、右击
、拖放
操作。
悬停操作 将鼠标移动到 悬停
区域上,该区域的背景色会变为红色。
单击操作 单击 单击
区域,该区域的文本会变为 Clicked!
,持续 5 秒。
双击操作 双击 双击
区域,该区域的文本会变为 Double Clicked!
,持续 5 秒。
右击操作 右击 右击
区域,该区域的文本会变为 Right Clicked!
,持续 5 秒。
拖放操作 拖放
区域可以任意拖动。
编写脚本 下面我们来编写脚本,实现上述操作。
1. 导入模块,创建浏览器驱动 1 2 3 4 5 6 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome()
2. 打开网页 1 driver.get("https://selenium-app.im0o.top/example5-2" )
3. 定位元素 1 2 3 4 5 6 7 8 9 10 hover_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-hover"]' ) click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-click"]' ) double_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-doubleclick"]' ) right_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-rightclick"]' ) drag_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-drag"]' )
4. 创建 ActionChains 对象 1 actions = ActionChains(driver)
5. 执行操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 actions.move_to_element(hover_area).perform() actions.click(click_area).perform() actions.double_click(double_click_area).perform() actions.context_click(right_click_area).perform() actions.click_and_hold(drag_area).move_by_offset(100 , 100 ).release().perform()
6. 关闭浏览器
完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("https://selenium-app.im0o.top/example5-2" ) hover_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-hover"]' ) click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-click"]' ) double_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-doubleclick"]' ) right_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-rightclick"]' ) drag_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-drag"]' ) actions = ActionChains(driver) actions.move_to_element(hover_area).perform() time.sleep(2 ) actions.click(click_area).perform() time.sleep(2 ) actions.double_click(double_click_area).perform() time.sleep(2 ) actions.context_click(right_click_area).perform() time.sleep(2 ) actions.click_and_hold(drag_area).move_by_offset(100 , 100 ).release().perform() input ("按 Enter 键退出" )driver.quit()
运行脚本 在 PyCharm 中,点击运行按钮,运行脚本。
实例:使用 Selenium 进行输入框操作 下面通过一个实例来演示如何使用 Selenium 进行输入框操作。
打开配套网页 打开 实例:使用 Selenium 进行输入框操作
如上图所示,网页提供了一个输入框。
输入文本 在输入框内输入任意文本,上方的提示文本会从 Type something in the input box.
变成 You typed: 你输入的文本
。
编写脚本 1. 导入模块,创建浏览器驱动 1 2 3 4 from selenium import webdriver driver = webdriver.Chrome()
2. 打开网页 1 driver.get("https://selenium-app.im0o.top/example5-1" )
3. 定位元素 1 2 3 4 5 input_box = driver.find_element(By.XPATH, '//*[@id="e5-Input"]' ) tip_text = driver.find_element(By.XPATH, '//*[@id="app"]/div/p' )
4. 输入文本 1 2 input_box.send_keys("你输入的文本" )
5. 获取提示文本,与输入文本进行比较 1 2 3 4 5 text = tip_text.text print ('比较结果: ' , text == "You typed: 你输入的文本" )
6. 关闭浏览器
完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://selenium-app.im0o.top/example5-1" ) input_box = driver.find_element(By.XPATH, '//*[@id="e5-Input"]' ) tip_text = driver.find_element(By.XPATH, '//*[@id="app"]/div/p' ) input_box.send_keys("你输入的文本" ) text = tip_text.text print ('比较结果:' , text == "You typed: 你输入的文本" )input ("按 Enter 键退出" )driver.quit()
运行脚本 在 PyCharm 中,点击运行按钮,运行脚本。
实训:使用 Selenium 模拟用户登录 在配套网页中,提供了一个登录表单,包含用户名和密码两个输入框,以及一个登录按钮。
请编写脚本,实现以下功能:
打开 实训:使用 Selenium 模拟用户登录
输入用户名和密码
点击登录按钮
获取登录结果
关闭浏览器