• Web自动化测试进阶:网页中难点之expected_ conditions的应用与原理


    前言

    expected_conditions是selenium的一个模块,可以对网页上元素进行判断,一般配合WebDriverWait使用。

    详细介绍说明

    1、title_is,判断当前页面的标题是否等于预期,返回布尔值

    也可以使用driver.title打印当前页面的标题

    1. from selenium import webdriver
    2. from selenium.webdriver.support.wait import WebDriverWait
    3. from selenium.webdriver.support import expected_conditions as EC
    4. driver = webdriver.Chrome()
    5. driver.set_window_size(480, 600)
    6. driver.get('https://www.baidu.com')
    7. # 判断当前页面的标题是否符合预期
    8. # title = WebDriverWait(driver, 5).until(EC.title_is('百度一下,你就知道'))
    9. # 返回的类型是TrueFalse
    10. # print(title)
    11. if EC.title_is('百度一下,你就知道'):
    12. print(True)
    13. print(driver.title)
    14. driver.quit()

    2、title_contains(),判断当前页面的标题是否包含预期字符串

    用法和title_is()类似,不重复介绍

    3、presence_of_element_located() 判断元素是否被加在DOM树里,并不代表该元素一定可见

    注意:传入的参数是tuple类型,第一个元素是定位方式,第二个元素是value。如果元素存在则返回元素位置,不存在则抛出异常(NoSuchElementException)

    1. from selenium import webdriver
    2. from selenium.webdriver.support import expected_conditions as EC
    3. driver = webdriver.Chrome()
    4. driver.set_window_size(480, 600)
    5. driver.get('https://www.baidu.com')
    6. r = EC.presence_of_element_located(('id', 'kw'))
    7. print(r(driver))

    4、visibility_of_element_located() 判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0)

    和presence_of_element_located()类型,区别是presence_of_element_located()只强调元素存在于DOM树中,可见不可见无所谓。
    如果元素存在且可见,就返回元素本身,如果存在但不可见则返回false

    1. 现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
    2. 如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
    3. 可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
    4. 分享他们的经验,还会分享很多直播讲座和技术沙龙
    5. 可以免费学习!划重点!开源的!!!
    6. qq群号:110685036

    5、visibility_of() 判断元素是否可见

    和visibility_of_element_located()作用一样,区别是传参不同,visibility_of()接收的参数是定位后的元素

    1. from selenium import webdriver
    2. from selenium.webdriver.support.wait import WebDriverWait
    3. from selenium.webdriver.support import expected_conditions as EC
    4. driver = webdriver.Chrome()
    5. driver.set_window_size(480, 600)
    6. driver.get('https://www.baidu.com')
    7. element = driver.find_element_by_id('kw')
    8. locate = WebDriverWait(driver, 5).until(EC.visibility_of(element))
    9. locate.send_keys('selenium')
    10. driver.quit()

    6、presence_of_all_element_located()

    判断是否至少有一个元素存在DOM树中

    7、text_to_be_present_in_element()

    判断某个元素中的text是否包含了预期的字符串

    1. from selenium import webdriver
    2. from selenium.webdriver.support.wait import WebDriverWait
    3. from selenium.webdriver.support import expected_conditions as EC
    4. driver = webdriver.Chrome()
    5. driver.set_window_size(480, 600)
    6. driver.get('https://www.baidu.com')
    7. r = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element(('xpath', '//*[@id="bottom_layer"]/div[1]/p[5]/a'), '使用百度前必读'))
    8. print(r)

    8、text_to_be_present_in_element_value()

    判断某个元素中的value属性是否包含了预期字符串

    1. from selenium import webdriver
    2. from selenium.webdriver.support.wait import WebDriverWait
    3. from selenium.webdriver.support import expected_conditions as EC
    4. driver = webdriver.Chrome()
    5. driver.set_window_size(480, 600)
    6. driver.get('https://www.baidu.com')
    7. # 判断某个元素的value属性值是否符合预期字符串
    8. r = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element_value(('id', 'su'), '百度一下'))
    9. print(r)

    9、frame_to_be_available_and_switch_to_it()

    判断该表单是否可以切换进去,如果可以,返回True并switch进去,否则返回False
    比如登录QQ邮箱:

    1. from selenium import webdriver
    2. from selenium.webdriver.support import expected_conditions as EC
    3. from selenium.webdriver.support.wait import WebDriverWait
    4. def find_element(located):
    5. if isinstance(located, tuple):
    6. return WebDriverWait(driver, 5).until(EC.presence_of_element_located(located))
    7. else:
    8. return '必须是元组类型'
    9. driver = webdriver.Chrome()
    10. driver.set_window_size(600, 800)
    11. driver.get('https://mail.qq.com/')
    12. # 判断iframe是否可以切换进去,返回布尔值
    13. is_switch = WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it(('id', 'login_frame')))
    14. print(is_switch)
    15. # 点击【帐号密码登录】
    16. WebDriverWait(driver, 5).until(EC.presence_of_element_located(('id', 'switcher_plogin'))).click()
    17. # 定位元素:账号输入框、密码输入框、登录按钮
    18. user_element = find_element(('id', 'u'))
    19. password_element = find_element(('id', 'p'))
    20. login_element = find_element(('id', 'login_button'))
    21. # 输入账号、密码、点击登录
    22. user_element.send_keys('xxxxx@qq.com')
    23. password_element.send_keys('password')
    24. login_element.click()
    25. driver.quit()

    10、invisibility_of_element_located()

    判断某个元素是否不存在与DOM树中或不可见

    1. from selenium import webdriver
    2. from selenium.webdriver.support import expected_conditions as EC
    3. driver = webdriver.Chrome()
    4. driver.set_window_size(480, 600)
    5. driver.get('https://www.baidu.com')
    6. a = EC.invisibility_of_element_located(('id', 'kw')) # 存在则返回False
    7. print(a(driver))

    11、element_to_be_clickable()

    判断元素是否可见并是可以点击的
    如果元素存在且可点击,则返回元素,如果元素存在但不可点击,则返回False

    1. from selenium import webdriver
    2. from selenium.webdriver.support import expected_conditions as EC
    3. driver = webdriver.Chrome()
    4. driver.set_window_size(480, 600)
    5. driver.get('https://www.baidu.com')
    6. # 百度页该元素不可点击,返回False
    7. a = EC.element_to_be_clickable(('xpath', '//*[@id="s-bottom-layer-right"]/span[2]'))
    8. print(a(driver))

    12、staleness_of()

    等到一个元素从DOM树中移除,传入element元素,可以判断页面是否刷新了

    13、element_to_be_selected()

    判断某个元素是否被选中,一般用在下拉列表,传入element元素

    14、element_selection_state_to_be()

    判断某个元素的选中状态是否符合预期,方法参数是element和 is_selected

    15、element_located_selection_state_to_be()

    与element_selection_state_to_be()作用一样,只是方法参数不同,方法参数是located和 is_selected

    16、alert_is_present()

    按断页面上是否存在alert警告

    今天的分享就到此结束了,大家还有什么不懂的可以评论区下提问哈,如果我的文章对你有所帮助的话,可以点赞三联支持一下哈

  • 相关阅读:
    Kaggle 专利匹配比赛赛后总结
    快手直播弹幕websocket protobuf序列化与反序列化
    spring-boot
    物联网边缘-物联网准入或接入安全防护产品及解决方案
    【Java 设计模式】创建者模式 之建造者模式
    Conmi的正确答案——Ubuntu修改国内源(阿里云 aliyun)
    【Tensorflow+自然语言处理+LSTM】搭建智能聊天客服机器人实战(附源码、数据集和演示 超详细)
    【C++进阶学习】第一弹——继承(上)——探索代码复用的乐趣
    Linux云主机安全入侵排查步骤
    dotnet 探究 SemanticKernel 的 planner 的原理
  • 原文地址:https://blog.csdn.net/m0_47485438/article/details/133857009