1128UI自动化测试经验分享-显式等待(二)expected_conditions模块、visibility_of_element_located(locator)

2023-05-16

expected_conditions模块 提供的预期条件判断类【模块包含一套预定义的条件集合】,大大方便了 WebDriverWait 的使用。

个人博客:https://blog.csdn.net/zyooooxie

一)expected_conditions模块

这儿是官方文档

https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#module-selenium.webdriver.support.expected_conditions

1.实际运用时,一般先通过as关键字将 expected_conditions重命名为ec,再调用预期条件方法来判断;

2.源码中 可以看到很多 条件判断的类 传参是locator 或 element:
locator - used to find the element,locator=(By.Xpath, ‘Xpath’) 使用By方法定位元素的元组;
element 要获取的WebElement元素对象

3.细致说下 17个类的知识( 我呕心沥血的结果 )

不推荐掌握
理由:
(A)实在太多(真心记不住),很多用得机会也很少
(B)有些条件判断的类 正常条件的返回值是A,和显式等待结合后返回值有可能是B,很容易记混
(D)element传参的时候元素的存在(可见、隐藏)与不存在,条件太复杂

        expected_conditions类提供的预期条件 判断方法如下:
        
        1.title_is(‘title’) 判断当前页面的title是否完全等于(==)预期字符串,
        返回布尔值:如果完全一致,返回Ture,否则返回Flase
        
        和显式等待结合后,条件符合返回True,不符合 显式等待+报错
        WebDriverWait(self.driver, 10).until(ec.title_is('百度一下,你就知道'), '失败')    打印结果是True
        
        2.title_contains(‘title’) 判断当前页面的title是否包含预期字符串,
        返回布尔值:True/False;如果完全一致,返回Ture,否则返回Flase
        
        和显式等待结合后,条件符合返回True,不符合 显式等待+报错
        WebDriverWait(self.driver, 10).until(ec.title_contains('知道'), '失败')     打印结果是True

        3.presence_of_element_located(locator) 判断某个locator元素是否被加到DOM树里,并不代表该元素一定可见(元素是隐藏的)
        如果定位到就返回WebElement,找不到元素 报错Message: no such element: Unable to locate element
        
        WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.ID, 'su')))      打印结果是WebElement
        和显式等待结合后,如果定位到就返回WebElement,找不到元素 显式等待+报错

        4.visibility_of_element_located(locator) 判断某个locator元素是否可见。
        可见代表非隐藏、可显示,并且元素的宽和高都大于0
        如果定位到就返回WebElement,找不到元素 报错Message: no such element: Unable to locate element
        
        WebDriverWait(driver, 10).until(ec.visibility_of_element_located((By.ID, 'su')))    打印结果是WebElement
        和显式等待结合后,如果定位到就返回WebElement,找不到元素 显式等待+报错
        
        5.visibility_of(element) 判断element元素是否可见。
        Visibility means that the element is not only displayed but also has a height and width that is greater than 0.
        
        直接传element;
        如果可见就返回这个WebElement元素;不可见就返回 False;找不到的 报错的是 no such element: Unable to locate element
        和显式等待结合后,不可见的 显式等待+报错;可见的返回WebElement;不存在的报错 Message: no such element: Unable to locate element

        WebDriverWait(driver, 10).until(ec.visibility_of(driver.find_element(By.ID, 'su')))
        WebDriverWait(driver, 10).until(ec.visibility_of(driver.find_element_by_link_text('高级搜索123')))
        如果是第二个 实际不会到显式等待

        10.invisibility_of_element_located(locator) 判断某个locator元素是否隐藏DOM树(隐藏、不存在、可见)
        # 可见的元素返回False,不存在的元素见返回True;隐藏的元素返回WebElement

        # 和显式等待结合后,可见的元素显式等待+报错;隐藏的元素会返回WebElement;不存在的元素 返回True
        # WebDriverWait(self.driver, 10).until(ec.invisibility_of_element_located((By.ID, 'toStationText')), '失败')
       
        7.text_to_be_present_in_element(locator,text) 判断某个locator元素的text是否包含了预期的字符串
        # 请先确定此元素的text [元素文本]
        # 符合就返回True,不符合返回False;
        # 和显式等待结合后,符合返回True;不符合,显式等待+报错
        
        WebDriverWait(self.driver, 10).until(ec.text_to_be_present_in_element((By.PARTIAL_LINK_TEXT, '多产'), '产品'), '失败')
        
        8.text_to_be_present_in_element_value(locator,value) 判断某个元素的value属性值是否包含了预期的字符串
        # 请先确定此元素的value属性值 print(abc.get_attribute('value'))
        # 条件符合 返回True;条件不符合返回False
        # 和显式等待结合后,返回返回True;条件不符合 显式等待+报错
        
        # WebDriverWait(driver, 10).until(ec.text_to_be_present_in_element((By.ID, 'su'),'百度一下'))
        # 等待'su'元素的value属性值是否包含'百度一下'

        9.frame_to_be_available_and_switch_to_it() 判断该frame是否可以switch进去

        # 如果直接传入定位方式id,可以的话就返回True并switch进去,否则返回False
        # 也可传入locator元组或WebElement,可以的话就返回True并switch进去,否则报错 Message: no such element

        # 和显式等待结合后,传入定位方式id、locator元组,可以的话就返回True并switch进去,否则 显式等待+报错
        # 和显式等待结合后,传入WebElement,可以的话就返回True并switch进去,
        # 否则找不到定位报错 selenium.common.exceptions.NoSuchElementException: Message: no such element
        # WebElement因为是去定位某个元素,定位不到会报错,用不到那个显式等待的!在执行前就已经报错 找不到元素

        frame的定位 driver.switch_to.frame(xxxx)   xxxx可以是id属性值;或是查找到这个元素WebElement,不可以使用locator元组
        
        WebDriverWait(driver, 10).until(ec.frame_to_be_available_and_switch_to_it('frame_id'))
        WebDriverWait(driver, 10).until(ec.frame_to_be_available_and_switch_to_it((By.ID, 'frame_id')))
        WebDriverWait(driver, 10).until(ec.frame_to_be_available_and_switch_to_it(
        driver.find_element(By.ID, 'frame_id')))

        11.element_to_be_clickable(locator) 判断某个locator元素是否可点击
        # 元素可以被看见visibility_of_element_located()并且可以被使用is_enabled()返回WebElement;
        # 找不到的元素 报错 Message: no such element: Unable to locate element
        # 隐藏的元素返回 False;

        # WebDriverWait 实际显式等待+ 报错的 包括 隐藏的元素和不存在的元素;可点击返回WebElement

        # WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.ID, 'su')))
        
        12.staleness_of(element) 等某个元素从DOM树中移除。传入WebElement对象
        
        # returns False if the element is still attached to the DOM, true otherwise.
        # 如果元素is_enabled()返回False;其他返回True;根本不存在的报错 Message: no such element

        # 和显式等待结合后,元素is_enabled() 显式等待+报错;不然返回True;根本不存在的报错 Message: no such element
        
        WebDriverWait(self.driver, 10).until(ec.staleness_of(self.driver.find_element_by_id('su')))

        13.element_to_be_selected(element) 等待element元素是被选中,一般用在下拉列表
        # 如果元素是被选中的,返回True;如果不是,返回False;定位失败的 报错 Message: no such element: Unable to locate element

        # 和显式等待结合后,符合条件返回True;不符合就显式等待+报错;定位失败的 报错 Message: no such element
        
        16.element_located_to_be_selected(locator) 等待locator元素是被选中
        # 如果元素是被选中的,返回True;如果不是,返回False;元素是根本不存在的,就报错 Message: no such element: Unable to locate element

        # 和显式等待结合后,符合条件的选项返回True;不符合条件的选项、和不存在的选项 都显式等待+报错

        14.element_selection_state_to_be(element, is_selected) 判断某个元素的选中状态是否符合预期;
        
        # 传入WebElement对象以及2种状态(True、False),相等返回True,否则返回False;找不到的报错 Message: no such element: Unable to locate element
        # is_selected is a Boolean.所以状态一定不能输入'is_selected'
        
        # 和显式等待结合后 符合判断条件的返回True;不符合判断条件的 显式等待+ 报错;找不到元素的报错 Message: no such element: Unable to locate element
        
        15.element_located_selection_state_to_be(locator,is_selected) 判断某个元素的选中状态是否符合预期。
        
        # 传入locator以及2种状态(True、False),相等返回True,否则返回False;找不到的报错 Message: no such element: Unable to locate element
        # is_selected is a Boolean.所以状态一定 不能输入'is_selected'
        
        # print(ec.element_located_selection_state_to_be(abcd10, 'is_selected')(self.driver))  # 返回 False

        # 和显式等待结合后,符合状态判断条件的选项 返回True;实际 显式等待 + 报错的 包括不符合状态判断条件的选项 和不存在的选项
        
        17.alert_is_present 判断页面是否存在alert

        # 如果有就切换到alert并返回这个Alert;如果没有就返回False

        # 和显式等待结合后,没有alert 就显式等待+报错;有alert 就返回这个Alert
                
        6.presence_of_all_elements_located(locator) 判断是否至少有1个元素存在DOM树中。
        # 如果定位到就返回WebElement列表,不存在的元素 返回的是 空列表;
        
        # 和显式等待结合后,定位到就返回WebElement列表,查不到这些元素 显式等待 + 报错
        # 和显式等待结合后, 符合 最少存在一个WebElement的 返回符合定位元素条件WebElement的列表,找不到元素的 显式等待+报错

        WebDriverWait(driver, 10).until(ec.presence_of_all_elements_located((By.ID, 'su')))
        
        18.visibility_of_any_elements_located 判断页面至少有一个元素可见 visible,
        传入locator,一旦定位就返回 the list of located WebElements;不可见(元素隐藏 或是 完全不存在,一个都没有)返回的是 空列表;
        
        和显式等待结合后, 符合 最少存在一个WebElement的 返回符合定位元素条件WebElement的列表,不可见(元素隐藏 或是 完全不存在的)显式等待+报错
        
        19.visibility_of_all_elements_located 判断页面all elements存在且可见 visible
        all elements are present and visible;
        传入locator,全部符合的 就返回 the list of located and visible WebElements;不能全部符合的返回False;不存在的元素返回 空列表;
         
        和显式等待结合后,符合 全部可见WebElement的 返回符合定位元素条件WebElement的列表,找不到元素的 + WebElement不能全部可见的 显式等待+报错

二)visibility_of_element_located(locator)

上面写的估计没有人会去看。所以分享点实际的:把元素查找作为条件的 显式等待 应该如何写?

expected_conditions模块 这儿有三种关于检查元素存在的类,我就不加上elements、invisible的那几个类了。

class presence_of_element_located(object):
    """ An expectation for checking that an element is present on the DOM
    of a page. This does not necessarily mean that the element is visible.
    locator - used to find the element
    returns the WebElement once it is located
    """
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        return _find_element(driver, self.locator)
class visibility_of_element_located(object):
    """ An expectation for checking that an element is present on the DOM of a
    page and visible. Visibility means that the element is not only displayed
    but also has a height and width that is greater than 0.
    locator - used to find the element
    returns the WebElement once it is located and visible
    """
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try:
            return _element_if_visible(_find_element(driver, self.locator))
        except StaleElementReferenceException:
            return False
class visibility_of(object):
    """ An expectation for checking that an element, known to be present on the
    DOM of a page, is visible. Visibility means that the element is not only
    displayed but also has a height and width that is greater than 0.
    element is the WebElement
    returns the (same) WebElement once it is visible
    """
    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        return _element_if_visible(self.element)

visibility_of()这个类之前分享过。 expected_conditions模块下的visibility_of()

下面来说下presence_of_element_located() 和 visibility_of_element_located():

(A).元素可见与否
presence_of_element_located()的注释:
This does not necessarily mean that the element is visible 这并不一定意味着该元素是可见的

visibility_of_element_located()的注释:
Visibility means that the element is not only displayed but also has a height and width that is greater than 0 可见性意味着元素不仅会显示,而且高度和宽度也会大于0

(B).传参及返回值
传参都是locator - used to find the element;返回的是the WebElement(略有不同)

UI的自动化测试的前提是 用户看到这个元素,对吧?所以我个人推荐使用的是visibility_of_element_located()

    def test_57j(self):
        """expected_conditions模块visibility_of_element_located类"""
        # visibility_of_element_located(locator) 判断某个locator元素是否可见(前提是存在)
        # 可见代表非隐藏、可显示,并且元素的宽和高都大于0
        # 如果定位到就返回WebElement

        from selenium.webdriver.support import expected_conditions as ec
        from selenium.webdriver.support.wait import WebDriverWait
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("https://www.baidu.com")

        print('开始', time.ctime())
        # 传入driver 返回一个WebElement
        print(ec.visibility_of_element_located((By.CSS_SELECTOR, 'input#kw'))(self.driver))

        # 传入driver 返回一个WebElement 获取tag_name\\获取class属性值
        print(ec.visibility_of_element_located((By.CSS_SELECTOR, 'input#kw'))(self.driver).get_attribute('class'))
        print('1', time.ctime())

        try:
            print(ec.visibility_of_element_located((By.CSS_SELECTOR, 'input#kw111'))(self.driver))
        except BaseException as e111:
            print(e111)     # 不存在的元素 报错 Message: no such element: Unable to locate element
        print('2', time.ctime())

        # 和显式等待结合
        print(WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.CSS_SELECTOR, 'input#kw')), '失败'))     # 返回WebElement
        print(WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.CSS_SELECTOR, 'input#kw')), '失败').get_attribute('class'))
        print('3', time.ctime())

        try:
            WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.CSS_SELECTOR, 'input#kkk1111')), '失败')
        except BaseException as e222:
            print(e222)     # 不存在的元素,显式等待+报错
        print('4', time.ctime())

        time.sleep(1)
        self.driver.quit()

下面是这个用例的执行结果:

开始 Wed Nov 28 12:55:59 2018
<selenium.webdriver.remote.webelement.WebElement (session=“56c7bc254293131e99ba4e78a5edf6ea”, element=“0.7407602759779224-1”)>
s_ipt
1 Wed Nov 28 12:55:59 2018
Message: no such element: Unable to locate element: {“method”:“css selector”,“selector”:“input#kw111”}
(Session info: chrome=67.0.3396.99)
(Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.17134 x86_64)

2 Wed Nov 28 12:55:59 2018
<selenium.webdriver.remote.webelement.WebElement (session=“56c7bc254293131e99ba4e78a5edf6ea”, element=“0.7407602759779224-1”)>
s_ipt
3 Wed Nov 28 12:55:59 2018
Message: 失败

4 Wed Nov 28 12:56:10 2018

Ran 1 test in 20.925s

下一次分享 显式等待(三)显式等待在脚本中的实际运用

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1128UI自动化测试经验分享-显式等待(二)expected_conditions模块、visibility_of_element_located(locator) 的相关文章

  • vue使用elementui select下拉库组件鼠标hover出现下拉框

    mounted 生命周期里去监听 鼠标进入和鼠标移出事件 this refs mySelect addEventListener mouseenter function this querySelector selectel el sele
  • 如何以编程方式更改布局的可见性

    有一种方法可以更改 XML 中视图的可见性 但如何以编程方式更改 XML 中定义的布局的可见性 如何获取布局对象
  • 检查 div ID 是否存在 (PHP)

    PHP 可以检查元素是否存在吗 我已经知道 javascript 方法 但我只是想尽可能避免它 如果你有 HTML 服务器端的字符串 你可以使用DOM文档 http php net manual en class domdocument p
  • 引用 JSON (Javascript) 对象的元素

    如何引用 JSON Javascript 对象的元素 示例 alert homes Agents 1 name
  • jQuery 选择具有相同类的随机元素

    我有 selectElement 类的元素 当我单击具有该类的元素时 我 选择 它 并给它另一个类 selectedElements 如果它还没有 但是 我有一个按钮 应该随机选择一定数量 例如 10 的 selectElement 类元素
  • 获取表单中的所有元素

    我想使用 Selenium 提交包含多个元素的表单 例如
  • 返回 PHP 多维数组中最后一个数组的元素

    如何在 PHP 中动态显示最后一个数组中的元素 例如 Array 0 gt Array id gt 6 user id gt 8 category path gt Sport 1 gt Array id gt 8 user id gt 8
  • 如何访问匿名对象中声明的字段?

    Java 允许您在匿名类中声明新字段 但我不知道如何从外部访问它们 甚至将它们设置为 public 也不让我这样做 class A public static void main String args Object o new Objec
  • 如何在 WPF 中隐藏组合框的项目

    有没有办法在 WPF 中隐藏组合框的项目 在我的用户控件中 有一个列表框 其中复选框项目绑定到 ObservableCollection 和一个带有组合框的数据网格
  • java中同一数组的元素比较

    我正在尝试比较同一数组的元素 这意味着我想将 0 元素与其他所有元素进行比较 将 1 元素与其他所有元素进行比较 依此类推 问题是它没有按预期工作 我所做的是我有两个从 0 到 array length 1 的 for 循环 然后我有一个
  • jquery查找元素的位置

    ul li one li li element li li text li li val li ul 我怎样才能获得职位ul被点击的li 我想这会为你做的 li click function alert this index 请注意 ind
  • 从 C# 中的 List 中选择 N 个随机元素

    我需要一个快速算法从通用列表中选择 5 个随机元素 例如 我想从 a 中获取 5 个随机元素List
  • Java 保护访问不起作用

    在java中 访问权限分为三个级别 公共 向世界开放 私人 仅向全班开放 受保护 仅对类及其子类开放 继承 那么为什么java编译器允许这种情况发生呢 TestBlah java public class TestBlah public s
  • 如何在android中使用可见和不可见的按钮

    我想让一个按钮不可见 当我单击另一个按钮时 不可见的按钮将变得可见 然后执行onClick 对可见按钮执行的操作 What onClick 我可以在可见按钮上使用的操作 我使用了如下所示的方法 donebutton Button findV
  • 在首页以外的其他页面中显示图像时出现问题(wordpress/html/css)

    您好 我有一个正在为客户做的小网站 我使用了 html css 网站并使用空白主题将其转移到 WordPress 到目前为止一切顺利 如果您愿意 请查看 energyshop se 在起始页中显示了顶部的两个图像 但没有显示其余选项卡 为什
  • 如何使用内联 JavaScript 或 CSS 隐藏 TD 标签?

    我怎样才能隐藏一个 td 使用 JavaScript 或内联 CSS 标记 hide visibility hidden td class hide td Edit 只为你 显示和可见性的区别就在于此 展示 具有许多属性或值 但您关注的是
  • Visibility.Collapsed 和 Visibility.Hidden 之间的区别

    之间有什么区别Visibility Collapsed and Visibility Hidden in WPF 不同之处在于Visibility Hidden隐藏控件 但保留它在布局中占用的空间 因此它渲染空白而不是控件 Visibilt
  • 如何通过xpath获取元素的索引?

    我有下一个结构 div div class column aaa div div class column bbb div div class column jjj div div 我想知道是否有一种方法可以使用 XPath 并编写一些查询
  • 跳过第一个元素之后的所有其他元素[重复]

    这个问题在这里已经有答案了 我知道如何在 Java 中做到这一点 但我正在学习 Python 不知道如何做到这一点 我需要实现一个函数 该函数返回一个列表 其中包含列表中的所有其他元素 从第一个元素开始 到目前为止 我不确定如何从这里开始
  • CSS,悬停一个元素,影响另一个元素

    当我将鼠标悬停在 li a 上时 我可以影响普通 CSS 中的另一个元素吗 因为我试图在悬停链接时将一个框作为背景元素滑入 与此网站导航完全相同 只是不是在激活时使用 而是通过悬停来使用 http www zindhai com http

随机推荐