自动化测试之三种元素等待方式(python3.10+selenium4)

一、设置等待的意义

因为某些元素或者某些操作只有加载完成才能够定位到。在写自动化的脚本时执行脚本是错的,提示没有找到元素。原因是:因为元素还没有被加载出来,查找的代码就已经被执行了,自然就找不到元素了,解决方式是:可以用等待,等元素加载完成后再执行查找元素的语句。

二、三种元素等待方式

1、sleep强制等待

time.sleep(5),单位是s,就是直接让线程休眠,这几秒啥事也不用干。

优点:简单明了。

缺点:如果设置sleep等待时间过短,元素还没加载出来,程序报错,sleep设置等待时间过长,元素早就加载出来了,程序还在等待,浪费的是时间,影响代码整体的运行效率。

from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep

# 定义一个谷歌浏览器的对象
driver = webdriver.Chrome()

# 打开百度页面
driver.get("https://www.baidu.com/")

# 定位到百度输入框,搜索热点新闻
driver.find_element(By.ID, "kw").send_keys("热点新闻")

# 定位到百度一下按钮,并且点击
driver.find_element(By.ID, "su").click()

# 加上强制等待,才能定位到元素
sleep(3)

# 从返回的结果页面,通过模糊匹配定位到包含了“腾讯网”的超连接
# partial_link_text定位:定位的链接文本内容在整个页面当中唯一的出现一次,那么可以准确定位到元素,否则默认返回第一个
# .click()点击的操作
driver.find_element(By.PARTIAL_LINK_TEXT, "腾讯网").click()

# 延时3秒
sleep(5)

# 退出浏览器
driver.quit()

2、implicitly_wait()隐式等待

implicitly_wait(20)默认是0s等待,设置之后的值是最大超时时间。

优点:在代码前部分加implicitly_wait(10),整个的程序运行过程中都会有效,(作用于全局,直接在初始化driver的后面加,后面的代码都会受影响),都会等待元素加载完成。

缺点:在设置的时间内没有加载到整个页面,则会报NosuchElementError错误,如果元素在第10s内被加载出来,自动执行下面的脚本,不会一直等待10s。非要加载到整个页面才执行代码,这样影响代码的执行效率,一般情况下,我们想要的结果是只需加载到了我要定位的元素就执行代码,不需要等待整个页面的完全加载出来再执行代码。

from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep

# 定义一个谷歌浏览器的对象
driver = webdriver.Chrome()

# 打开百度页面
driver.get("https://www.baidu.com/")

# 定位到百度输入框,搜索热点新闻
driver.find_element(By.ID, "kw").send_keys("热点新闻")

# 定位到百度一下按钮,并且点击
driver.find_element(By.ID, "su").click()

# 加上隐式等待
driver.implicitly_wait(5)

# 从返回的结果页面,通过模糊匹配定位到包含了“腾讯网”的超连接
# partial_link_text定位:定位的链接文本内容在整个页面当中唯一的出现一次,那么可以准确定位到元素,否则默认返回第一个
# .click()点击的操作
driver.find_element(By.PARTIAL_LINK_TEXT, "腾讯网").click()

# 延时3秒
sleep(5)

# 退出浏览器
driver.quit()

3、WebDriverWait()显式等待

显式等待就是明确的要等到某个元素的出现或者是某个元素的可点击等,等到就可以返回元素对象;在超时时间到达之后仍未等到,那么就抛出TimeoutException。(简而言之,就是直到元素出现才去操作,如果超时则报异常)。

expected_conditions as EC:

判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_conditions模块收集了一系列的场景判断方法。

案例一:title_is:判断当前页面的title是否完全等于(==)预期字符串,返回布尔值。

# from selenium.webdriver.support.ui import WebDriverWait
# 判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_conditions模块收集了一系列的场景判断方法
from selenium.webdriver.support import expected_conditions as EC
# from selenium.webdriver.common.by import By
from selenium import webdriver

# 案例一
# title_is:判断当前页面的title是否完全等于(==)预期字符串,返回布尔值。
driver = webdriver.Chrome()

driver.get("https://www.baidu.com/")

title = EC.title_is("百度一下,你就知道")(driver)
print(title)

案例二:title_contains :判断当前页面的title是否包含预期字符串,返回布尔值。

from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver

# 案例二
# title_contains:判断当前页面的title是否包含预期字符串,返回布尔值
driver = webdriver.Chrome()

driver.get("https://www.baidu.com/")

title = EC.title_contains("百度")(driver)
print(title)

案例三:

presence_of_element_located :判断某个元素是否被加到了dom树里,并不代表该元素一定可见。

WebDriverWait函数:

driver:浏览器驱动

timeout:最长超时时间,默认以秒为单位

poll_frequency:检测的间隔(步长)时间,默认为0.5S

ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常

该WebDriverWait类中提供两个方法用于处理等待的条件:

until(method, message=' '):调用该方法提供的驱动程序作为一个参数,直到返回值为True

until_not(method, message=' '):调用该方法提供的驱动程序作为一个参数,直到返回值为False

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from time import sleep

# 定义一个谷歌浏览器的对象
driver = webdriver.Chrome()

# 打开百度页面
driver.get("https://www.baidu.com/")

# 定位到百度输入框,搜索热点新闻
driver.find_element(By.ID, "kw").send_keys("热点新闻")

# 定位到百度一下按钮,并且点击
driver.find_element(By.ID, "su").click()

# 添加一个显式等待
element = WebDriverWait(driver, 10, 0.5, ignored_exceptions=None).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "腾讯网")), "找不到")

element.click()

sleep(2)

driver.quit()

猜你喜欢

转载自blog.csdn.net/Little_Carter/article/details/128915678