selenium之WebDriverWait

一、初识

WebDriverWait是Selenium中的一个等待类,它提供了一种方法,可以让Selenium在特定条件成立之前等待一段时间。在自动化测试中,等待是非常重要的,因为如果代码过于迅速地运行,可能会导致页面未完全加载,从而导致测试失败。WebDriverWait可以帮助我们解决这个问题,让测试更加可靠。

WebDriverWait的基本用法是在实例化时指定一个WebDriver实例和等待的最长时间(以秒为单位),然后使用该实例的until()方法并提供一个期望条件。如果该条件在等待时间内成立,则until()方法将立即返回,否则将引发超时异常。

期望条件可以是多种类型的,例如:

  • presence_of_element_located(locator):等待元素出现在DOM中,例如By.ID、By.NAME等
  • visibility_of_element_located(locator):等待元素在页面中可见,即它不仅存在于DOM中,而且还在视觉上可见。
  • element_to_be_clickable(locator):等待元素可以被点击。
  • text_to_be_present_in_element(locator, text):等待元素中包含特定的文本。

     二、示例

    以下是WebDriverWait的一个示例用法,等待页面上的一个元素出现:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    # 创建WebDriver实例
    driver = webdriver.Chrome()
    # 导航到页面
    driver.get("https://example.com")
    # 创建WebDriverWait实例
    wait = WebDriverWait(driver, 10)
    # 等待元素出现
    element = wait.until(EC.presence_of_element_located((By.ID, 'my-element')))
    # 在元素上执行操作
    element.click()
    # 关闭浏览器
    driver.quit()

    在这个例子中,WebDriverWait将等待最长10秒钟,直到id为'my-element'的元素出现。如果在10秒钟内该元素未出现,WebDriverWait将引发超时异常。一旦该元素出现,WebDriverWait将立即返回,并将元素对象返回给变量element,以便在之后执行操作。

    三、登录页面验证码测试

    1.步骤

    (1)使用Selenium启动一个浏览器,导航到登录页面。

    from selenium import webdriver
    # 创建WebDriver实例
    driver = webdriver.Chrome()
    # 导航到登录页面
    driver.get("https://example.com/login")
    

    (2)使用Selenium找到验证码输入框和提交按钮,并向其发送正确的验证码和其他必要的登录信息。

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    # 等待验证码输入框和提交按钮出现
    wait = WebDriverWait(driver, 10)
    captcha_input = wait.until(EC.presence_of_element_located((By.ID, 'captcha')))
    submit_button = wait.until(EC.presence_of_element_located((By.ID, 'submit')))
    # 发送验证码和其他登录信息
    captcha_input.send_keys("1234")
    username_input = driver.find_element_by_id("username")
    password_input = driver.find_element_by_id("password")
    username_input.send_keys("myusername")
    password_input.send_keys("mypassword")
    submit_button.click()
    

    (3)如果验证码不正确,Selenium会在提交表单后获取错误消息。

    # 等待错误消息出现
    error_message = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'error-message')))
    # 确认错误消息是否包含"验证码错误"的文本
    assert "验证码错误" in error_message.text
    

    2.完整代码:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    # 创建WebDriver实例
    driver = webdriver.Chrome()
    # 导航到登录页面
    driver.get("https://example.com/login")
    # 等待验证码输入框和提交按钮出现
    wait = WebDriverWait(driver, 10)
    captcha_input = wait.until(EC.presence_of_element_located((By.ID, 'captcha')))
    submit_button = wait.until(EC.presence_of_element_located((By.ID, 'submit')))
    # 发送验证码和其他登录信息
    captcha_input.send_keys("1234")
    username_input = driver.find_element_by_id("username")
    password_input = driver.find_element_by_id("password")
    username_input.send_keys("myusername")
    password_input.send_keys("mypassword")
    submit_button.click()
    # 等待错误消息出现
    error_message = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'error-message')))
    # 确认错误消息是否包含"验证码错误"的文本
    assert "验证码错误" in error_message.text
    # 关闭浏览器
    driver.quit()