zoukankan      html  css  js  c++  java
  • Selenium 三种等待方式详解

    我们在做WEB自动化时,一般要等待页面元素加载完成后,才能执行操作,否则会报找不到元素的错误,这样就要求我们在有些场景下加等待时间。

    我们平常用到的有三种等待方式:

    • 强制等待
    • 隐式等待
    • 显示等待

    一、强制等待


    利用time模块的sleep方法来实现,最简单粗暴的等待方法

    代码:

    # coding = utf-8
    from time import sleep
    from selenium import webdriver
    # 驱动文件路径
    driverfile_path = r'D:coshipTest_Frameworkdriverschromedriver.exe'
    # 启动浏览器
    driver = webdriver.Chrome(executable_path=driverfile_path)
    # 打开百度首页
    driver.get(r'https://www.baidu.com/')
    # 等待3秒
    sleep(3)
    driver.find_element_by_css_selector("#kw").send_keys("selenium")
    # 退出
    driver.quit()

    这种叫强制等待,不管你浏览器是否加载完成,都得给我等待3秒,3秒一到,继续执行下面的代码,不建议用这种等待方法,严重影响代码的执行速度

    二、隐式等待


    设置一个等待时间,如果在这个等待时间内,网页加载完成,则执行下一步;否则一直等待时间截止,然后再执行下一步。这样也就会有个弊端,程序会一直等待整个页面加载完成,直到超时,但有时候我需要的那个元素早就加载完成了,只是页面上有个别其他元素加载特别慢,我仍要等待页面全部加载完成才能执行下一步。

    代码:

    # coding = utf-8
    from selenium import webdriver
    # 驱动文件路径
    driverfile_path = r'D:coshipTest_Frameworkdriverschromedriver.exe'
    # 启动浏览器
    driver = webdriver.Chrome(executable_path=driverfile_path)
    # 打开百度首页
    driver.get(r'https://www.baidu.com/')
    driver.find_element_by_css_selector("#kw").send_keys("selenium")
    driver.find_element_by_css_selector("#su").click()
    # 隐式等待30秒
    driver.implicitly_wait(30)
    result = driver.find_elements_by_css_selector("h3.t>a")
    for i in result:
        print(i.text)
    # 退出
    driver.quit()

    三、显示等待


    上面我们说了隐式等待的一个弊端,如果我想等我要的元素一加载出来就执行下一步,该怎么办?这里就要用到显示等待

    显示等待要用到WebDriverWait

    from selenium.webdriver.support.wait import WebDriverWait

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

    我们先看一下WebDriverWait的帮助文档:

    >>> help(WebDriverWait)
    Help on class WebDriverWait in module selenium.webdriver.support.wait:
    
    class WebDriverWait(builtins.object)
     |  Methods defined here:
     |
     |  __init__(self, driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
     |      Constructor, takes a WebDriver instance and timeout in seconds.
     |
     |      :Args:
     |       - driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)
     |       - timeout - Number of seconds before timing out
     |       - poll_frequency - sleep interval between calls
     |         By default, it is 0.5 second.
     |       - ignored_exceptions - iterable structure of exception classes ignored
    during calls.
     |         By default, it contains NoSuchElementException only.
     |
     |      Example:
     |       from selenium.webdriver.support.ui import WebDriverWait
     |
     |       element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_i
    d("someId"))
     |
     |       is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleExcepti
    on)).
     |
     |                   until_not(lambda x: x.find_element_by_id("someId").is_displ
    ayed())
    WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

    主要有4个参数:

    driver:浏览器驱动

    timeout:等待时间

    poll_frequency:检测的间隔时间,默认0.5s

    ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException

    代码:

    # coding = utf-8
    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    # 驱动文件路径
    driverfile_path = r'D:coshipTest_Frameworkdriverschromedriver.exe'
    # 启动浏览器
    driver = webdriver.Chrome(executable_path=driverfile_path)
    # 打开百度首页
    driver.get(r'https://www.baidu.com/')
    driver.find_element_by_css_selector("#kw").send_keys("selenium")
    driver.find_element_by_css_selector("#su").click()
    # 超时时间为30秒,每0.2秒检查1次,直到class="tt"的元素出现
    text = WebDriverWait(driver,30,0.2).until(lambda x:x.find_element_by_css_selector(".tt")).text
    print(text)
    # 退出
    driver.quit()
  • 相关阅读:
    SpringMVC(四)-- 文件下载、自定义拦截器、异常处理
    SpringMVC(三)-- 视图和视图解析器、数据格式化标签、数据类型转换、SpringMVC处理JSON数据、文件上传
    SpringMVC(二)--处理数据模型、ModelAndView、Model、Map、重定向、@ModelAttribute、
    SpringMVC(一)--基础、REST、@RequestParam、POST请求乱码等
    反射
    servlet基础
    eclipse为项目设置jdk
    mysql创建表时符号``的作用
    redis进阶
    相对路径和绝对路径的区别
  • 原文地址:https://www.cnblogs.com/eastonliu/p/9102239.html
Copyright © 2011-2022 走看看