Selenium自动化测试----智能等待

implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。

如果超出了设置时间的则抛出异常。

需要特别说明的是:隐性等待对整个driver的周期都起作用,所以只要设置一次即可,我曾看到有人把隐性等待当成了sleep在用,走哪儿都来一下…

WebDriverWait()
详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver -
WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
timeout - 最长超时时间,默认以秒为单位
poll_frequency -
休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions -
超时后的异常信息,默认情况下抛 NoSuchElementException 异常。

实例:

from selenium.webdriver.support.ui import WebDriverWait
....
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).
until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())

WebDriverWai()一般由 unit()或 until_not()方法配合使用,下面是 unit()和 until_not()方法的说明。
until(method, message=’ ’)
调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。
until_not(method, message=’ ’)
调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。

先看个代码实例:

# -*- coding: utf-8 -*-
fromselenium importwebdriver
fromselenium.webdriver.support.wait importWebDriverWait
fromselenium.webdriver.support importexpected_conditions as EC
fromselenium.webdriver.common.by importBy
driver=webdriver.Firefox()
driver.implicitly_wait(10)# 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者
driver.get(‘https://huilansame.github.io‘)
locator=(By.LINK_TEXT, ‘CSDN‘)
try:
WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locator))
printdriver.find_element_by_link_text(‘CSDN‘).get_attribute(‘href‘)
finally:
driver.close()

上例中,我们设置了隐性等待和显性等待,在其他操作中,隐性等待起决定性作用,在WebDriverWait..中显性等待起主要作用,但要注意的是:最长的等待时间取决于两者之间的大者,此例中为20,如果隐性等待时间 > 显性等待时间,则该句代码的最长等待时间等于隐性等待时间。

看了以上内容基本上很清楚了,调用方法如下:

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

这里需要特别注意的是until或until_not中的可执行方法method参数,很多人传入了WebElement

对象,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id(‘kw‘)) # 错误

这是错误的用法,这里的参数一定要是可以调用的,即这个对象一定有 __call__() 方法,否则会抛出异常:

TypeError: ‘xxx‘ object is not callable

在这里,你可以用selenium提供的 expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法,或者用自己封装的方法都可以,那么接下来我们看一下selenium提供的条件有哪些:

expected_conditions

expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:

  • title_is : 判断当前页面的title是否精确等于预期
  • title_contains : 判断当前页面的title是否包含预期字符串
  • presence_of_element_located : 判断某个元素是否被加到了dom树里,并不代表该元素一定可见
  • visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
  • visibility_of : 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
  • presence_of_all_elements_located : 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是‘column-md-3‘,那么只要有1个元素存在,这个方法就返回True
  • text_to_be_present_in_element : 判断某个元素中的text是否 包含 了预期的字符串
  • text_to_be_present_in_element_value : 判断某个元素中的value属性是否 包含 了预期的字符串
  • frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
  • invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见
  • element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
  • staleness_of : 等某个元素从dom树中移除,注意,这个方法也是返回True或False
  • element_to_be_selected : 判断某个元素是否被选中了,一般用在下拉列表
  • element_selection_state_to_be : 判断某个元素的选中状态是否符合预期
  • element_located_selection_state_to_be : 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
  • alert_is_present : 判断页面上是否存在alert

上面是所有17个condition,与until、until_not组合能够实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。

分析

以title_is为例

class title_is(object):
    """An expectation for checking the title of a page.
    title is the expected title, which must be an exact match
    returns True if the title matches, false otherwise."""
    def __init__(self, title):
        self.title = title

    def __call__(self, driver):
        return self.title == driver.title

可以看到 title_is 实际上是1个class,其 __call__ 方法被定义成是返回1个bool值。因此,一般的用法就是

# 实例化
the_instance = title_is(‘expected‘)
# 直接在实例上调用__call__
the_instance(dr) #return True or False
时间: 2025-01-01 21:12:09

Selenium自动化测试----智能等待的相关文章

java selenium (十三) 智能等待页面加载完成

我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作.  否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操作 selenium 中提供了非常简单,智能的方法,来判断元素是否存在. 阅读目录 实例要求 实例:set_timeout.html 下面的html 代码,  点击click 按钮5秒后, 页面上会出现一个红色的div快, 我们需要写一段自动化脚本智能的去判断这个div是否存在, 然后把这个div

关于selenium的智能等待页面加载的问题

我们经常会碰到用selenium操作页面上某个元素的时候,需要等待页面加载完成后,才能操作, 否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后,才能操作. 首先来讲,我们最不推荐的就是使用  Thread.sleep( ) ;  这个也叫做线程休眠. 这种写法通常是固定了一个时间,然而我们不知道页面具体的等待情况,有快有慢,虽然很百搭,但是并不适用于框架中. selenium 中提供了非常简单,智能的方法,来判断元素是否存在.我来简单的举例说明几种(在我

Java Selenium (十二) 操作弹出窗口 & 智能等待页面加载完成 & 处理 Iframe 中的元素

一.操作弹出窗口   原理 在代码里, 通过 Set<String> allWindowsId = driver.getWindowHandles(); 来获取到所有弹出浏览器的句柄, 然后遍历, 使用swithcto.window(newwindow_handle)方法. 就可以定位到新的窗口. 测试页面的HTML <html> <head> <title>常见web ui元素操作, 及API使用</title> <script type

selenium自动化测试(1):环境搭建

Selenium是一款优秀的WEB自动化测试工具,它功能强大,易于使用,支持多种平台.多种浏览器和多种开发语言.这里介绍使用python+selenium进行自动化测试的一些基础知识. 在Windows下搭建测试环境,首先需要下载Python,Selenium应该还不支持Python 3.x系列,所以最好选择Python 2.x,注意区分32位和64位. Python的安装特别简单,需要提醒的是,安装路径中千万不要包含空格(最好也别包含中文),否则后面使用pip安装扩展包的时候可能会失败!其他的

基于python语言的Selenium自动化测试

  一.Selenium简介 Selenium是一个web自动化应用测试工具,还支持所有的web的管理任务自动化.并且开源免费,也是一个web自动化轻量级框架.它支持多种浏览器.跨平台.跨操作系统.支持多种编程语言编写脚本,还能进行分布式测试用例的执行. Selenium经历三个版本,Selenium1.Selenium2.Selenium3.它不是单独的一个工具,而是由一些类库.插件.工具等组合而成.主要的工具: Selenium IDE:Selenium IDE是嵌入火狐浏览器中的一个插件,

selenium自动化测试框架之PO设计模式

面向对象的特性:封装.继承.多态.在自动化中一样适用,Selenium自动化测试中有一个名字常常被提及PageObject(思想与面向对象的特性相同),通过PO模式可以大大提高测试用例的维护效率. ##传统测试脚本的弊端 测试脚本分离,维护成本高 可扩展性差 复用性低等 PageObject设计模式 PO的核心要素: 在PO模式中抽象封装成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性. 每个一个page都继承BasePage,通过driver来管理本page中元素

WebDriverWait智能等待查找元素,提高代码的执行效率,不浪费时间,减少代码量

from selenium.webdriver.support.wait import WebDriverWait智能等待10s之后获取元素,获取的是单个元素def find_element(self, locator):WebDriverWait(self.driver, 10).until(lambda the_driver: the_driver.find_element(locator)) return self.driver.find_element(*locator) # 智能等待1

selenium自动化测试工具模拟登陆爬取当当网top500畅销书单

selenium自动化测试工具可谓是爬虫的利器,基本动态加载的网页都能抓取,当然随着大型网站的更新,也出现针对selenium的反爬,有些网站可以识别你是否用的是selenium访问,然后对你加以限制. 当当网目前还没有对这方面加以限制,所以今天就用这个练习熟悉一下selenium操作,我们可以试一下爬取一下当当网top500的畅销书单的相关信息,页面如下: 虽然这个页面不用登录就可以进来,但是我们可以随便试一下模拟登陆,直接在这个页面上面点击登录进入登录界面,然后会弹出一下窗口, 这是百分百会

转:Selenium的延迟等待

Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wait). 1.显式等待 显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception. 如: 1 new WebDriverWait(driver, 15).until( 2     ExpectedConditions.presenceOfElementLocated(By.cssSelector(&qu