前言
Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。
目的:
-
确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下都能正常工作。
-
验证应用程序的功能是否符合需求规格说明书。
-
提高测试效率,减少重复劳动。
-
提前发现潜在的缺陷,降低修复成本。
这里分享web端元素获取&元素等待
01 元素获取
为什么要学习获取元素信息的方法
主要为了获取相关的信息进行断言,判断自动化用例最终的执行结果。
获取元素常用的方法:
-
size 获取元素的大小 返回的是一个字典,里面包含 元素高度和宽度的值
-
text 获取元素的文本内容
-
get_attribute("attribute") 获取元素对应属性名称的属性值 , attribute表示的是属性名
-
is_displayed() 判断元素是否可见 返回值为true或者false
-
is_enabled() 判断元素是否可用,返回值为true或者false
-
is_selected() 判断复选框或者单选框是否被选中,返回值为true或者false
示例代码:
# 导包import timefrom selenium import webdriverfrom selenium.webdriver.common.by import By # 实例化浏览器驱动driver = webdriver.Chrome() # 打开百度网站driver.get("https://www.baidu.com") # 最大化浏览器窗口time.sleep(3)driver.maximize_window() # 获取百度输入框的大小size = driver.find_element(By.CLASS_NAME, "s_ipt").sizeprint(size) # 获取超链接"hao123网站"的文本内容text = driver.find_element_by_link_text("hao123").textprint(text) # 获取超链接"hao123网站"的地址address = driver.find_element(By.LINK_TEXT, "hao123").get_attribute("href")print(address) # 判断文库超链接是否可见,默认是Falseresult = driver.find_element(By.XPATH, "//*[@class ='s-bri c-font-normal c-color-t'] ").is_displayed()print("文库超链接可见:", result) # 判端百度一下按钮是否可用,默认是Falseresult = driver.find_element(By.ID, "su").is_enabled()print("'百度一下'按钮可用", result) # 点击页面右上角【登录】按钮,进入登录页面driver.find_element(By.ID, "s-top-loginbtn").click() # 注意需要等待几秒等待元素出现,否则会报错time.sleep(5) # 判断页面中"阅读并接受"前的复选框是否选中result = driver.find_element_by_css_selector(".pass-checkbox-input").is_selected()print("页面中'阅读并接受'前的复选框已选中", result) # 等待3Stime.sleep(3) # 关闭浏览器窗口driver.quit()
02 元素等待
元素等待是指在自动化测试过程中,为了等待某个元素出现或者满足某种条件而暂停脚本执行的一种技术。在定位页面元素时,如果没有找到该元素,会在指定时间内一直等待的过程。以下是常用的三种元素等待类型:
-
隐式等待:在一段时间内检查网页是否加载完成,如果加载完成,则进行下一步操作;如果在设置的时间内没有加载完成,则会报超时加载。
-
显式等待:在指定的时间内等待某个特定元素的出现,如果该元素在指定时间内出现,则立即执行相应的操作;如果超过等待时间元素仍未出现,则抛出异常。
-
强制等待:使用time.sleep()方法,使程序在指定的时间内暂停执行。但如果等待时间设置过短,元素可能还未加载完成,程序会报错;如果等待时间设置过长,会浪费时间,降低代码整体的运行效率。
2.1. 隐式等待
概念:在查找元素时自动等待一定的时间,以确保元素已经加载完成。如果在定位过程中找到了元素,直接返回该元素,继续后面的操作,如果超过了指定时间,就会抛出 NoSuchElementException 异常。
隐式等待实现方式:
driver.implicitlty_wait(timeout) # timeout表示的是最长的等待时间 单位为S
隐式等待的优点是简单易用,只需要设置一次,对所有的元素定位的方法都是有效的,不需要明确指定等待某个特定元素的出现。它适用于大多数情况,但在某些复杂的网页结构或网络延迟较高的情况下,可能需要使用显式等待来更精确地控制等待时间。
代码示例:
# 导包import timefrom selenium import webdriverfrom selenium.webdriver.common.by import By # 实例化浏览器驱动driver = webdriver.Chrome() # 设置隐式等待时间为5秒driver.implicitly_wait(5) # 打开要百度网站driver.get("https://www.baidu.com") # 点击右上角"设置",点击"搜索设置"driver.find_element(By.ID, 's-usersetting-top').click()driver.find_element_by_link_text("搜索设置").click() # 注意下面这段代码,如果设置等待时间为0就会报错# 判断"全部语言"单选框是否被选中driver.find_element_by_css_selector("[for = 'SL_0']").is_selected() # 等待3Stime.sleep(3) # 退出浏览器驱动driver.quit()
2.2. 显示等待
概念:显示等待是指在执行某个操作之前,等待特定条件的满足。例如定位指定元素时,如果能找到该元素,那么就直接返回该元素,如果找不到,那么每隔指定的时间再去定位该元素,如果超出最长等待时间,那么就抛出TimeOutException。
其工作原理如下:
-
设置等待时间和条件:指定一个等待时间和一个条件,在规定时间内,每隔一段固定时间查看下条件是否成立。
-
检查条件是否成立:如果条件在等待时间内成立,程序将继续执行;否则,将提示一个超时异常。
显示等待的实现:
导入WebDriverWait等待类
WebDriverWait(driver, timeout, poll_frequency=0.5).until(lambda x:x.find_element(By.ID, "userA"))
-
driver 指的是浏览器驱动对象
-
timeout 表示的是最长等待时间
-
poll_frequency 表示的是检测的间隔时间,默认是0.5
-
until until方法跟上匿名函数来实现元素定位。
代码示例:
# 导包import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWait # 实例化浏览器驱动driver = webdriver.Chrome()driver.maximize_window() # 打开测试网站driver.get("https://www.baidu.com") # 点击右上角"设置"driver.find_element(By.ID, 's-usersetting-top').click() # 点击"搜索设置"driver.find_element_by_link_text("搜索设置").click() # 显示等待判断"全部语言"单选框是否被选中# element = driver.find_element(By.CSS_SELECTOR, "[for = 'SL_0']").is_selected() 注意如果用这行代码代替下面一行代码,会报错element = WebDriverWait(driver, 5, 0.5).until(lambda x: x.find_element(By.CSS_SELECTOR, "[for = 'SL_0']"))result = element.is_selected()print("'全部语言'单选框被选中:", result) # 等待3Stime.sleep(3) # 退出浏览器驱动driver.quit()
2.3. 强制等待
强制等待就是让代码休眠,不做任何的操作
time.sleep(time) time单位为S
常用的场景:
在 UI 自动化中,一般在以下情况下可能需要使用强制等待:
-
网络延迟或加载缓慢:当网络连接较慢或页面加载时间较长时,元素可能需要一些时间才能完全显示或可用。在这种情况下,强制等待可以给系统一些时间来完成加载。
-
不稳定的环境或外部因素:如果自动化测试在不稳定的环境中运行,例如网络连接不稳定或系统资源有限,强制等待可以提供一定的容错性,以确保操作有足够的时间完成。
-
已知的固定时间延迟(某些操作可能具有已知的固定时间延迟):
-
例如在提交表单后等待服务器响应。在这种情况下,使用强制等待可以模拟这种延迟。
-
当要获取元素的文本内容时,而元素的文本内容是需要通过后台接口请求并渲染的,此时,如果使用隐式等待或显示等待是没有办法获取到文本内容,所以需要使用强制等待。
-
当要操作的元素已经存在,但是有其他的元素需要等待且与该操作的元素有业务关联,如果使用隐式等待或显示等待对该元素进行操作的话,是没有办法进行的,也需要使用强制等待。
代码示例(此代码仅为演示代码,场景需根据实际场景进行判断):
# 导包import timefrom selenium import webdriverfrom selenium.webdriver.common.by import By # 实例化浏览器驱动driver = webdriver.Chrome()driver.maximize_window() # 打开测试网站driver.get("https://www.baidu.com") # 通过name定位到输入框并输入"新闻"time.sleep(2)element = driver.find_element(By.NAME, 'wd')element.send_keys("新闻") # 点击"百度一下"按钮:element = driver.find_element(By.ID, 'su')element.click()time.sleep(3) # 退出浏览器,释放资源driver.quit()