selenuim(三)显示等待和隐式等待

1、显示等待

显示等待是指在代码中设置等待时间,在等待时间内轮询页面元素是否出现,直到元素出现或等待时间结束。显示等待可以更加精确地控制等待时间,提高测试的稳定性和可靠性。

显示等待需要使用 WebDriverWait 类和 expected_conditions 模块。示例代码如下:

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

driver = webdriver.Chrome()
driver.get("http://www.example.com")
wait = WebDriverWait(driver, 10)
elem = wait.until(EC.presence_of_element_located((By.ID, "my-id")))

上面的代码中,WebDriverWait 类指定了最大等待时间为 10 秒,presence_of_element_located 方法指定了要等待的元素的定位方式。如果在 10 秒内找到了该元素,则返回该元素;如果超时仍未找到该元素,则抛出 TimeoutException 异常。

WebDriverWait源码解读

WebDriverWait(driver实例, 超时时长, 调用频率, 忽略的异常).until(要调用的 方法, 超时时返回的信息)

class WebDriverWait:
    def __init__(
        self,
        driver,
        timeout: float,
        poll_frequency: float = POLL_FREQUENCY,
        ignored_exceptions: typing.Optional[WaitExcTypes] = None,
    ):
        """Constructor, takes a WebDriver instance and timeout in seconds.

        :Args:
         - driver - WebDriver实例 (Ie, Firefox, Chrome or Remote)
         - timeout - 超时前的秒数
         - poll_frequency - 呼叫之间的睡眠间隔(默认值是0.5秒)
         - ignored_exceptions - 调用期间被忽略的异常类的可迭代结构。
          默认情况下,它只包含NoSuchElementException。

       
        """

WebDriverWait实例初始化传参

  • driver:WebDriver实例,传入前面声明的driver即可 
  • timeout:最大超时时间;
  • poll_frequency:执行间隔,默认0.5s
  • ignored_exceptions:需要忽略的异常
    •   如果在调用 until() 或 until_not() 的过程中抛出这个元组中的异常, 则不中断代码,继续等待;
    •   如果抛出的是这个元组外的异常,则中断代码;
    •   忽略的异常默认只有 NoSuchElementException 

WebDriverWait实例的两个方法

until(self, method, message='') 

作用:每隔一段时间(上面的poll_frequency)调用method,直到返回值不为False或不为

method:需要执行的method

message:抛出异常时的文案,会返回 TimeoutException ,表示超时

注意:这个才是常用的,如:定位元素直到不返回空

until_not(self, method, message='') 

作用:调用method,直到返回值False或

method:需要执行的method

message:抛出异常时的文案,会返回  TimeoutException ,表示超时

官方例子:

 from selenium.webdriver.support.wait import WebDriverWait

 element = WebDriverWait(driver, 10).until(lambda x: x.find_element(By.ID, "someId"))
 is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element(By.ID, "someId").is_displayed())

expected_conditions 的使用方法

expected_conditions 模块提供了多种条件,用于指定要等待的元素。下面是一些常用的条件:

  • presence_of_element_located:元素出现在 DOM 中,但不一定可见。
  • visibility_of_element_located:元素出现在 DOM 中,并且可见。
  • element_to_be_clickable:元素出现在 DOM 中,并且可见且可点击。
  • text_to_be_present_in_element:元素出现在 DOM 中,并且包含指定的文本。
  • title_contains:页面的标题包含指定的文本。
  • title_is:页面的标题等于指定的文本。

下面是使用 presence_of_element_locatedvisibility_of_element_located 的示例代码:

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

driver = webdriver.Chrome()
driver.get("http://www.example.com")

# 等待元素出现在 DOM 中,但不一定可见
wait = WebDriverWait(driver, 10)
elem = wait.until(EC.presence_of_element_located((By.ID, "my-id")))

# 等待元素出现在 DOM 中,并且可见
elem = wait.until(EC.visibility_of_element_located((By.ID, "my-id")))

显示等待的注意事项

使用显示等待时,需要注意以下几点:

  1. 显示等待只对等待期间的代码有效,等待结束后的代码不受影响。
  2. 显示等待的等待时间应该尽量准确,过长或过短都会影响测试的效率和准确性。
  3. 显示等待可以设置多个条件,例如需要等待元素出现且可见,可以使用 visibility_of_element_located 方法。
  4. 显示等待可以结合使用多种定位方式,例如使用 By.IDBy.CLASS_NAME 进行组合定位。

总结

Selenium 显示等待是一种更加精确的等待方式,能够提高测试的稳定性和可靠性。使用显示等待需要使用 WebDriverWait 类和 expected_conditions 模块,指定等待时间和等待条件,常用的等待条件包括 presence_of_element_locatedvisibility_of_element_located。在使用显示等待时需要注意等待时间的准确性,以及多个条件的组合使用。

2、隐式等待

隐式等待是指在代码中设置全局的等待时间,对整个测试过程都有效。在隐式等待时间内,如果元素没出现,Selenium 会等待指定的时间后再次查找该元素,直到元素出现或超时。隐式等待可以减少代码量,但是可能会对测试效率产生影响。

隐式等待需要使用 implicitly_wait 方法来设置等待时间。示例代码如下:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.example.com")
elem = driver.find_element_by_id("my-id")

上面的代码中,implicitly_wait 方法设置了全局等待时间为 10秒,如果在这个时间内元素未出现,Selenium 会等待指定的时间后再次查找该元素,直到找到该元素或超时。

隐式等待的注意事项

使用隐式等待时,需要注意以下几点:

  1. 隐式等待只对查找元素的代码有效,不对其他代码有效。
  2. 隐式等待的等待时间应该尽量准确,过长或过短都会影响测试的效率和准确性。
  3. 隐式等待会对整个测试过程都生效,可能会对测试效率产生影响。
  4. 隐式等待不能精确控制等待时间,如果需要更加精确地控制等待时间,应该使用显示等待。

隐式等待和显示等待的区别

隐式等待和显示等待都是 Selenium 中的等待方式,它们的区别如下:

  1. 隐式等待是全局的等待时间,对整个测试过程都有效,而显示等待是在代码中明确设置的等待时间,只对设置的代码段有效。
  2. 隐式等待只能等待元素是否出现,而显示等待可以指定多个条件,例如等待元素出现且可见。
  3. 隐式等待不能精确控制等待时间,只能设置一个全局等待时间,而显示等待可以更加精确地控制等待时间,提高测试的稳定性和可靠性。

总结

Selenium 隐式等待是一种全局的等待方式,可以通过 implicitly_wait 方法设置等待时间。使用隐式等待需要注意等待时间的准确性,以及可能会对测试效率产生影响。相比之下,显示等待更加精确,可以指定多个条件并控制等待时间,但需要在代码中明确设置等待时间。在实际测试中,应根据具体情况选择合适的等待方式。

你可能感兴趣的:(selenium,selenium,自动化)