selenium常用操作之等待操作
Posted 123blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium常用操作之等待操作相关的知识,希望对你有一定的参考价值。
页面自动化中,不得不提的元素等待操作,selenium为我们提供了三大等待方式:强制等待、隐性等待和显性等待
1.强制等待:time.sleep(秒)
如果使用time.sleep(10)表示让程序死等10秒钟,无论发生什么都会在10秒后再去执行后续的代码。
智能等待分为:隐性等待、显性等待
2.隐式等待:implicitly_wait(20)
全局设置一次(与显性等待不同)
隐形等待元素不一定是可见的(与显性等待不同)
智能等待的隐形等待:会话开始之后使用隐形等待,之后整个会话周期内所有的找元素都会调用隐形等待,等待元素可见,等待命令执行,全局都可用
from selenium import webdriver # 打开谷歌浏览器,建立会话。启动Chromedriver.exe 打开Chrome driver = webdriver.Chrome() # 智能等待的隐形等待:会话开始之后使用隐形等待,之后所有的找元素都会调用隐形等待,等待元素可见,等待命令执行 # implicitly_wait(译:隐婆思类.威特) driver.implicitly_wait(20) # 访问百度首页 driver.get("http://www.baidu.com") # 点击登录按钮 driver.find_element_by_xpath(‘//div[@id="u1"]//a[@name="tj_login"]‘).click() # 点击 用户名登录 按钮 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click() # 关闭浏览器 driver.quit()
3.显性等待:他有非常多的条件
与隐形等待的不同;可以处理很多中情况如:
- 等待元素可见
- 等待元素可用
- 等待新窗口出现
- 等待 url地址=xxx的时候
- 等待 的上限是多少秒,每隔0.5秒去查看条件是否成立
- 明确等到某个条件满足之后,再去执行下一步操作。
- 程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到等待的元素可见
- 超过设置的最长时间,然后抛出TimeoutException. --- .
- WebDriverWait类:显性等待类。
- WebDriverWait(driver,等待时长,轮循周期).until()/until_ not()
- expected_ conditions模块: 提供了-系列期望发生的条件。
什么时候用?
- 当你的操作,引起了页面的变化,而你接下来要操作变化 的元素的时候,就一定要加等待。
1.使用之前,引入相关的库
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.common.by import By
使用方法:
2、确定元素的定位表达式
web_ locator = ‘XXXX‘
3、调用webdriverWait类设置等待总时长、轮询周期。并调用期until、until_ not方法。
WebDriverWait(webdriver对象名,等待总时长,轮询周期),until(判断条件)
4、使用expected_ conditions对 应的方法来生成判断条件。
EC.类名((定位方式、定位表达式))
例: EC.presence_ of_ element_ located((By.CSS_ SELECTOR,web locator)))
例:等待百度登陆的弹出框出现,再去操作弹出框。
# 使用之前,引入相关的库 from selenium.webdriver.support.wait import WebDriverWait # 等待条件 from selenium.webdriver.support import expected_conditions as EC # 等待元素可见的条件 from selenium.webdriver.common.by import By # 定位类型八种定位方式 from selenium import webdriver # 打开谷歌浏览器,建立会话。启动Chromedriver.exe 打开Chrome driver = webdriver.Chrome() # 访问百度首页 driver.get("http://www.baidu.com") # 点击登录按钮 driver.find_element_by_xpath(‘//div[@id="u1"]//a[@name="tj_login"]‘).click() # 等待元素 id=TANGRAM__PSP_10__footerULoginBtn 可见。等待上限是10秒。直到 条件可见 loc = (By.ID, "TANGRAM__PSP_10__footerULoginBtn") # EC.visibility_of_element_located(loc) # 等待元素可见的条件 # until 直到什么什么 WebDriverWait(driver, 10, 0.5).until(EC.visibility_of_element_located(loc)) # 点击 用户名登录 按钮 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click() # 关闭浏览器 driver.quit()
以下是列举expected_conditions模块中常用的条件类:
这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
title_is
title_contains
这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, ‘kw‘)
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
presence_of_element_located
presence_of_all_elements_located
这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的
visibility_of_element_located
invisibility_of_element_located
visibility_of
这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value
这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
这个条件判断是否有alert出现
alert_is_present
这个条件判断元素是否可点击,传入locator
element_to_be_clickable
这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
第三个传入WebElement对象以及状态,相等返回True,否则返回False
第四个传入locator以及状态,相等返回True,否则返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
staleness_of
上面是所有17个condition,与until、until_not组合能够实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。
以上是关于selenium常用操作之等待操作的主要内容,如果未能解决你的问题,请参考以下文章
详解介绍Selenium常用API的使用--Java语言(完整版)
软件测试体系学习及构建(26)Selenium使用丨WebDriverAPI常用操作