从零开始编写Web自动化测试脚本(四)--自动化中的三种等待

第一章 Selenium+WebDriver环境搭建
第二章 Selenium定位方式
第三章 元素常用属性
第四章 自动化中的三种等待
第五章 自动化浏览器设置及句柄、窗口切换操作
第六章 鼠标、键盘操作
第七章 javascript在自动化中的应用
第八章 unittest&断言
第九章 ddt数据驱动
第十章 测试框架搭建过程Python+Selenium+BeautifulReport



一、三种等待方式

1、强制等待

强制等待:sleep(x),顾名思义,强制让浏览器必须等待X秒,进行下一步操作,不管前后步骤是否完成。在Python中,是基于time模块的sleep方法来实现。
优点:使用简单。
缺点:浪费不必要的等待时间,影响测试用例的执行效率。

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://wwww.baidu.com")
#强制等待3秒
time.sleep(3)
driver.quit()

2、隐性等待

隐性等待:implicitly_time(x),在x秒时间内,页面加载完成,进行下一步操作。隐性等待设置一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步操作。
优点:隐性等待对整个driver的周期都起作用,每一次操作都会调用隐性等待,只需设置一次即可。
缺点:①有时页面想要的元素早已加载完成,但因为网页上个别元素没有加载完,仍要等到页面全部完成才能执行下一步,使用不是很灵活。
②在等待时间内页面没有加载完成,时间一到也会进入下一步操作;这种情况可能出现要定位的元素没有出现,从而报元素无法找到的错误。

from selenium import webdriver

driver = webdriver.Chrome()
#隐性等待5秒
driver.implicitly_wait(5)
driver.get("https://wwww.baidu.com")
driver.quit()

3、显性等待

显性等待:WebDriverWait类,对指定元素进行等待的一种等待方式。通过设置最大等待时间,检查频率对页面的元素来进行等待,一旦找到元素,则停止等待,进入后续步骤。
优点:等待判断准确,不会浪费多余的等待时间,可以提高测试用例的执行效率。
缺点:①使用相对前两种较为复杂
②多个元素的等待,需要多次写入

二、显性等待的使用方法

①首先需要导包,from selenium.webdriver.support.wait import WebDriverWait
②对WebDriverWait类进行实例化操作,
WebDriverWait(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
driver,浏览器驱动
timeout,最大等待时间
poll_frequency=POLL_FREQUENCY,间隔的频率时间
ignored_exceptions=None,超时后的异常信息,默认抛出NoSuchElementException
③调用until()和until_not()方法来等待元素
def until(method, message=‘’)
含义:直到条件成立返回为真,等待结束。如果超时,抛出TimeoutException,将message传入异常。
参数:
method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False,一般使用lambda匿名函数。
message:提示信息,出现异常时会将这个信息输出在控制台。
def until_not(method, message=‘’)
含义:与until相反,当某个元素消失或什么条件不成立时则继续执行,参数与until相同。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://wwww.baidu.com")
# 定位到搜索栏,输入selenium
driver.find_element(By.ID, "kw").send_keys("selenium")
# 点击搜索按钮
driver.find_element(By.ID, "su").click()
time.sleep(15)
# 定位到第一条搜索结果
ele = driver.find_element(By.XPATH, '//*[@id="1"]/div/div/h3/a')
# 实例化WebDriverWait对象,最大等待20秒,间隔1秒
wait = WebDriverWait(driver, 20, poll_frequency=1)
# 调用until()方法,一直等到第一条搜索结果存在于页面上
wait.until(lambda x: ele.is_displayed())
# 点击第一个搜索结果
ele.click()
time.sleep(3)
driver.quit()

三、判断元素的方法

1、判断某个元素是否在页面上:ele.is_displayed()
2、判断某个元素是否被选中:ele.is_selected()
3、判断某个元素是否可被操作:ele.is_enables()

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

driver = webdriver.Chrome()
driver.get("https://wwww.baidu.com")
# 打印搜索按钮是否存在页面上,返回True
print(driver.find_element(By.ID, "su").is_displayed())
# 打印搜索按钮是否被选中,返回False
print(driver.find_element(By.ID, "su").is_selected())
# 打印搜索按钮是否可操作,返回True
print(driver.find_element(By.ID, "su").is_enabled())
time.sleep(3)
driver.quit()

三、判断元素的操作

1、判断元素的操作:expected_conditions,是selenium的一个模块,主要用于对页面元素的加载进行判断,包括元素是否存在,是否可点击等。
2、expected_conditions模块导包,使用过程中,一般对其重命名为EC。

	from selenium.webdriver.support import expected_conditions as EC

3、EC模块单独使用语法:

	EC.方法名(参数)(driver)
	EC.方法名(参数).__call__(driver)

4、EC模块的常用操作
①title_is(title)
title_is(title)判断网页title是否等于特定文本(区分大小写),若完全相同则返回True,否则返回False。
②title_contains(title)
title_contains(title)判断网页title是否包含特定文本(区分大小写),若包含则返回True,否则返回False。

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

driver = webdriver.Chrome()
driver.get("https://wwww.baidu.com")
time.sleep(3)
#校验网页标题是否是"百度一下,你就知道"
print(EC.title_is("百度一下,你就知道")(driver))
#校验网页标题是否包含"百度"
print(EC.title_contains("百度一下,你就知道")(driver))
driver.quit()

③presence_of_element_located(locator)
presence_of_element_located(locator)判断一个元素存在于页面DOM树中,存在则返回元素本身,不存在则报错。
参数locator:定位器是一个数据类型元祖
(“元素定位方式”, “定位方式对应的值”)
(“id”, “id属性值”)或者(By.ID, “id属性值”)
④presence_of_elements_all_located(locator)
presence_of_elements_all_located(locator)判断定位的元素范围内,至少有一个元素存在于页面中,存在则以list形式返回元素本身,不存在则报错。

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

driver = webdriver.Chrome()
driver.get("https://wwww.baidu.com")
time.sleep(3)
# 定位百度热搜标题
hot_search = (By.CLASS_NAME, "title-content-title")
# 打印presence_of_all_elements_located()返回list形式元素本身
print(WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(hot_search)))
# 定位搜索栏元素
input_search = (By.ID, "kw")
# 等待并判断搜索栏元素存在后,输入"selenium"
WebDriverWait(driver, 10).until(EC.presence_of_element_located(input_search)).send_keys("selenium")
time.sleep(3)
driver.quit()

随手点赞一次,运气增加一份。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拒绝内卷的小测试

感谢老板的投喂

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值