web自动化之常见元素操作
前言:使用selenium做web UI自动化时,元素操作是最基本的,是用例的基础,所以在框架实战之前先好好学习常见元素操作吧~
一、常见元素操作有哪些?
1)三大等待
2)三大切换
3)下拉列表操作
4)鼠标操作
5)键盘操作
6)js操作
7)滚动条操作
8)日期框操作
9)文件上传操作
二、如何实现上述元素操作?
1、三大等待
1)为什么需要等待?
===> 当页面操作引起页面元素变化,如:肉眼可见的一些加载过程,代码在肉眼之前就已经“看见”,所以需要加载完成之后才能继续后续操作。
两个常用概念:
===> 1⃣️ 等待元素存在:查找元素之前,元素必须存在于DOM页面中
===> 2⃣️ 等待元素可见:操作元素之前,元素必须可见
2)什么情况下需要等待?
===> 页面操作引起页面变化,而要操作的元素是页面变化后的新元素,那么此时就需要等待新元素可见之后才能操作。
3)三大等待指的是什么?
===> 1⃣️ 强制等待:sleep
===> 2⃣️ 隐形等待:implicitly_wait()
===> 3⃣️ 显性等待:WebdriverWait + expected_condition
4)强制等待:sleep
===> 不管元素是否加载完成,也不管条件是否满足,都会等待所设置的时长。
===> 常在调试代码和辅助隐形等待/显性等待时使用。
示例:
import time from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element(By.ID, "kw").send_keys("selenium") driver.find_element(By.ID, "su").click() time.sleep(2) # 等待搜索后页面元素都加载完成 # 执行后续页面操作 driver.quit()
5)隐形等待:implicitly_wait()
===> 属于智能等待
===> 全局设置一次隐形等待,那么整个会话期间(打开浏览器到关闭浏览器的过程)全部应用。
===> 仅适用以下两种场景:
1⃣️ 等待元素存在,即等待DOM页面里有这个元素
2⃣️ 等待命令执行完成
===> 设置等待上限,时间上限范围内,元素什么时候存在了,就不等了,等待超时则抛出异常
代码实现:
driver.implicitly_wait(30)
一般放在启动浏览器会话后,即 driver=webdriver.Chrome() 后
import time from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() # 隐形等待 driver.implicitly_wait(30) driver.get("http://www.baidu.com") driver.find_element(By.ID, "kw").send_keys("selenium") driver.find_element(By.ID, "su").click() time.sleep(2) # 等待搜索后页面元素都加载完成 # 执行后续页面操作 driver.quit()
===> 弊端:只适用于两种场景,其他场景处理不了。如:等待元素可见、等待元素可用、等待新窗口出现、等待页面所有匹配的元素可见…
6)显性等待:WebdriverWait + expecte_conditions
===> 属于智能等待,等的是条件,即在时间上限范围内,等待某某条件成立时,就结束等待。
两要素:
===> 1⃣️ 等待 (带有时间上限和轮询周期,时间上限是必须值,轮询周期默认值为0.5) ==> WebdriverWait 类实现
用法:WebdriverWait(driver, 时间上限, 轮询周期).until(条件)
示例:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions driver = webdriver.Chrome() # 隐形等待 driver.implicitly_wait(30) driver.get("http://www.baidu.com") driver.find_element(By.ID, "kw").send_keys("selenium") driver.find_element(By.ID, "su").click() # 要等待的元素的定位策略 loc = (By.XPATH, "//a[text()='百度翻译']") # 显性等待 WebDriverWait(driver, 30).until(expected_conditions.visibility_of_element_located(loc)) driver.find_element(*loc).click() time.sleep(2) # 等待搜索后页面元素都加载完成 # 执行后续页面操作 driver.quit()
===> 2⃣️ 条件 --> expected_conditions模块提供
用法:expected_conditions.xxx条件(定位策略)
常见的显性等待条件:
元素可见:expected_conditions.visibility_of_element_located(元素定位策略)
元素存在:expected_conditions.presence_of_element_located(元素定位策略)
alert弹框存在:expected_conditions.alert_is_present(元素定位策略)
iframe可见并切换:expected_conditions.frame_to_be_available_and_switch_to_it(元素定位策略)
新的窗口打开:expected_conditions.new_window_is_opened(窗口句柄)
2、三大切换
1)窗口切换
注意⚠️ :窗口切换前是需要等待新窗口的出现的,有两种方式。
===> 1⃣️ 直接time.sleep()
===> 2⃣️ 通过ec模块的new_window_is_opened类来实现
两要素:
===> 1⃣️ (获取要切换的窗口的)窗口句柄,窗口句柄即窗口的ID,可以通过 driver.window_handles() 获取所有的窗口句柄,返回的是一个列表,列表的最后一个元素便是最新打开窗口的句柄。
===> 2⃣️ 切换,driver.switch_to.window(窗口句柄)
# 等待新窗口出现 time.sleep(2) # 1)获取当前所有窗口的句柄 wins = driver.window_handles() # 2) 切换至最新打开窗口 driver.switch_to.window(wins[-1])
2)iframe切换
1⃣️ iframe是什么?
===> 简而言之,iframe就是html中的html。
2⃣️ 什么情况下需要切换iframe?
===> 当要操作的元素在iframe中时,就需要切进iframe里,才能找到并操作该元素。
3⃣️ 怎么确定要操作的元素在iframe中?
===> 查看元素路径即可
4⃣️ 如何进行iframe切换?
===> 第一步:找到要切换的iframe
1)通过iframe的name属性
2)通过iframe的下标,从0开始
3)通过8大定位方式找到iframe并返回WebElement对象,即driver.find_element_by_xxx()
===> 第二步:切换
1)driver.switch_to.frame(“name属性值”)
2)driver.switch_to_frame(1) 下标,此处表示第二个iframe
3)driver.switch_to_frame(driver.find_element_by_xxx(“定位表达式”))
注意:切换完成后,可操作的范围是新的html,如果要继续操作主页面的html元素,则需要切回主页面,即driver.switch_to.default_content()
3)alert切换
===> js的三种弹框(不属于html页面元素):alert、confirm、prompt
1⃣️ 什么情况下需要切换?
===> 当某些页面操作触发js弹框出现时,如果不关闭掉,不能继续进行下一步页面操作,此时就需要切换至弹框,然后关闭弹框。
2⃣️ 如何进行alert切换?
===> 第一步:实例化一个alert对象
alt = driver.switch_to.alert
===> 第二步:操作alert弹框
1)关闭弹框(点击取消):alt.dismiss()
2) 关闭弹框(点击确定):alt.accept()
3) 获取弹框文本信息:alt.text
4) 输入文本:alt.send_keys(“文本内容”)
3、鼠标操作
注意⚠️ :能不使用鼠标操作就尽量不用,因为鼠标操作的稳定性不好。
===> 通过 ActionChains类 实现模拟鼠标操作
1)鼠标操作两要素:
===> 1⃣️ 将动作放置到动作链中:
ac = ActionChains()
ac.动作
==> 常见鼠标动作:
(1)click() -> 单击,与WebElement的click方法类似,一般不用鼠标操作来实现点击
🌟(2)move_to_element(元素对象) -> 悬浮
(3)context_click() -> 右键
(4)double_click() -> 双击
(5)click_and_hold() -> 左键点击并保持
(6)release() -> 释放
(7)drag_and_drop() -> 拖拽 是由两个内部方法实现的( click_and_hold() + release() )
(8)pause() -> 暂停
===> 2⃣️ 执行动作链中的动作
ac.perform()
4、下拉列表操作
1)select类型的下拉列表:即由select、option标签实现的下拉列表
==> selenium提供了专门的类来处理这种类型的下拉列表,Select类初始化时须提供参数select元素对象
==> Select类提供了三种方式选择选项:
=> (1)value属性
=> (2)下标,从0开始
=> (3)文本
使用步骤:
===> 1⃣️ 初始化一个select对象:select = Select(driver.find_element_by_xxx(select标签的定位表达式))
===> 2⃣️ 选择下拉列表选项:
(1)select.select_by_value(“选项的value值”)
(2)select.select_by_index(选项的下标)
(3)select.select_visible_text(“选项的文本内容”)
2)非select类型的下拉列表:该怎么做怎么做,如下:
==> 1)触发下拉列表出现 --> 点击/悬浮
==> 2) 等待要操作的元素可见
==> 3)选择要操作的元素 --> 点击
5、键盘操作
===> 通过send_keys()方法+Keys类实现,send_keys()方法可以接收多个参数
示例:
1)输入内容后,点击enter:
driver.find_element_by_xxx().send_keys(“xxxx”, Keys.ENTER)
2)实现ctrl+c:
driver.find_element_by_xxx().send_keys(Keys.CONTROL, “c”)
3)实现翻页:
driver.find_element_by_xxx().send_keys(Keys.PAGE_DOWN)
6、js操作
selenium提供了执行js代码的方法:execute_script(参数1, 参数2, 参数3…)
==> 参数1:js语句,语句中用arguments[下标]来接收外部传参 即参数2/参数3…
==> 参数2/参数3…:js语句所需参数
应用:
1)通过js操作滚动条:
1⃣️ 元素存在于页面,但不可见于页面,需要滚动到可视区域之后才能操作
ele = driver.find_element_by_xxx()
driver.execute_script(“arguments[0].scrollIntoView(false)”, ele)
注:scrollIntoView()默认与页面顶部对其,false表示与页面底部对其
2⃣️ 页面级别的滚动条,直接滚动到页面底部/顶部
driver.execute_script(“window.scrollTo(0, document.body.scrollHeight)”)
driver.execute_script(“window.scrollTo(document.body.scrollHeight, 0)”)
2)通过js操作日期框:通过js修改元素的属性
注意:针对不能直接输入的输入框,如果能输入,直接通过send_keys()输入即可
==> 不能输入的输入框,修改readOnly属性为false
var ele = document.getElementByXX();
ele.readOnly = false;
ele.value = '';
7、上传操作
1)输入框类型的文件上传:
==> 通过send_keys(本地文件路径)即可
2)点击上传后调出了windows框的文件上传:
==> 处理windows控件的三方工具:
1)autoitv3 === 三方软件,需要下载安装,有自己的格式,需要写脚本,需要转换为python可执行的 文件
2)SendKeys === 三方库,2003年,太老版本,不一定支持python3.7
3)pywin32 === 主要使用,只处理windows控件。引入win32gui和win32con库
4)pyautowin === 对chrome driver有要求,不一定兼容
==> windows控件识别工具WinSpy辅助查看并定位控件元素
注:具体方法参考百度...此处不做详解...