• Selenium的3种等待方式


    一、等待是做什么的,为什么需要等待

    在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,这时候,我们就需要使用等待,来判断上一步操作是否完成,什么时候可以进行下一步操作。

    否则,上一步操作如果花费的时间较长,还没有完成,就去进行下一步操作,这时就会产生无法定位到元素,元素状态不正确,数据校验结果不正确等异常。

    例如在进行登录操作时,要等待登录页面加载成功,才能定位到用户名和密码输入框,然后填充用户名和密码,进行登录操作。

    例如需要定位的元素在某个弹窗上,只有这个弹窗打开之后,才能定位到这个元素。

    例如需要验证查询的结果,数据是否正确,就要等查询结束之后,再去定位所需要验证的数据等等。

    二、Selenium的3种等待方式

    1.强制等待

    使用方法:sleep(X),等待X秒后,进行下一步操作。

    第一种也是使用最简单的一种办法就是强制等待sleep(X),强制让浏览器等待X秒,不管当前操作是否完成,是否可以进行下一步操作,都必须等X秒的时间。

    缺点:不能准确把握需要等待的时间(有时操作还未完成,等待就结束了,导致报错;有时操作已经完成了,但等待时间还没有到,浪费时间),如果在用例中大量使用,会浪费不必要的等待时间,影响测试用例的执行效率。

    优点:使用简单,可以在调试时使用。

    示例:打开登录页面,等待3秒,进行登录操作,如果3秒内登录页面没有加载完,下一步操作就会报错。

    2.隐式等待

    使用方法:implicitly_wait(X),在X时间内,页面加载完成,进行下一步操作。

    第二种方法是隐形等待,其设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步操作。

    缺点:使用隐式等待,程序会一直等待整个页面加载完成,才会执行下一步操作;

    但有时候页面想要的元素早已经加载完成了,但是因为网页上个别元素还没有加载完成,仍要等到页面全部完成才能执行下一步,使用也不是很灵活。

    优点:隐性等待对整个driver的周期都起作用,所以只要设置一次即可。

    示例:打开登录页面,等待页面加载完成后,如果30秒内,页面加载完成,就进行登录操作,不再继续等待,如果30秒内登录页面没有加载完,下一步操作就会报错。

    3.显式等待

    使用方法:WebDriverWait(driver, 超时时间, 调用频率, 要忽略的异常).until(要执行的方法, 超时时返回的错误信息)

    locator = (By.LINK_TEXT, 'A')

    A就是可以作为判断操作是否完成的标志

    WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))

    20:最长等待时间。

    0.5:检查间隔时间,每隔0.5秒检查一次操作是否完成。

    EC.presence_of_element_located(locator):判断目标元素是否已经成功加载。

    忽略异常:如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

    第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件进行灵活地等待了。

    它主要的意思就是:程序每隔X秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException异常。

    缺点:使用相对比较复杂

    优点:等待判断准确,不会浪费多余的等待时间,在用例中使用,可以提高执行效率。

    示例:打开登录页面,以登录按钮为页面加载成功的标志,如果20秒内,定位到登录按钮,就进行登录操作,不再继续等待,如果20秒内还没有定位到登录按钮,下一步操作就会报错,并抛出异常。

    WebDriverWait类

    1.until()
    until()方法:直到条件成立返回为真,等待结束。如果超时,抛出TimeoutException,将message传入异常。

    2.until_not()
    until_not()方法:直到条件不成立返回为真,是当某元素消失或什么条件不成立则继续执行,等待结束。如果超时,抛出TimeoutException,将message传入异常。

    3.expected_conditions 异常处理模块
    expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件方法。


    以下两个条件验证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


    4.WebElement自带方法

    is_displayed() :判断元素是否展示出来

    is_enabled():判断元素是否可操作

    is_selected():判断元素是否被选中

  • 相关阅读:
    Chromium 和Webkit 3月14日的最近进展:多标签选择、标签标题省略、动画API和新的Chromium Logo
    奇妙的HTML5 Canvas动画实例
    XNA那些事(一) 框架工作原理
    实现跨浏览器的HTML5占位符
    编写超级可读代码的15个最佳实践
    谈HTML5和CSS3的国际化支持
    HTML5 Guitar Tab Player
    如何设置让网站禁止被爬虫收录?robots.txt
    YourPHP笔记
    Robots.txt  禁止爬虫
  • 原文地址:https://www.cnblogs.com/x00479/p/14254001.html
Copyright © 2020-2023  润新知