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语言(完整版)

Selenium常用的三种等待方式

selenium常用操作之上传操作

软件测试体系学习及构建(26)Selenium使用丨WebDriverAPI常用操作

爬虫之selenium和webdriver—基础:操作cookie和显式等待与隐式等待

Java+selenium之WebDriver的cookie,等待等高级操作