在Python中添加Selenium Web驱动等待

本文将介绍用Python在Selenium Web驱动中添加等待的例子。

Python Selenium Web驱动的等待

大多数Web应用程序使用AJAX技术。因此,网页上的不同元素需要不同的时间间隔才能完全上传,因为Selenium无法找到任何文本,直到它出现在网页上。

我们可能会发现,在某些应用程序的网页上,特定的文本在被上传之前是不存在的。这在测试一个应用程序时产生了错误。

这个问题可以通过使用waits来解决。这些等待在搜索一个元素或在网页上的任何其他操作时提供了灵活性。

selenium web驱动提供两种类型的等待。第一种是隐式等待,第二种是显式等待。

本文将讨论这两种类型的等待的细节。

Selenium Web驱动中的隐式等待

由于网络速度慢或网站响应慢,可能会有这样的情况:我们必须等待几秒钟才能得到所有的结果。在这种情况下,隐式等待效果最好。

隐式等待告诉Web驱动在寻找元素时轮询DOM的特定时间,以便在我们的Web驱动获取元素时使所有元素可用。这个过程的默认设置是0

一旦我们设置了隐式等待,它将在Web驱动对象的生命周期内。

只要我们在不关闭或重启和改变等待值的情况下运行同一个Web驱动,它将是相同的数量。

让我们通过一个例子,我们将进入一个网站并等待10秒,之后,我们将点击About Us 页面链接,如下所示。

示例代码:

# python
from selenium import webdriver
ChromeDriver = webdriver.Chrome()
ChromeDriver.implicitly_wait(10)
ChromeDriver.get("https://www.inventicosolutions.com/")
getElemByLink = ChromeDriver.find_element_by_link_text("About Us")
getElemByLink.click()

输出:

在Python中添加Selenium Web驱动等待

从上面的例子可以看出,在加载页面后,它正好等待了10秒才进入About Us

Selenium Web驱动中的显式等待

显式等待是一种定义为等待特定条件发生并在代码中进一步进行的代码类型。显式等待的极端情况是time.sleep()

这为等待设置了条件,是一个确切的时间段。

一些适当的方法可以帮助我们写一个显式代码。显式等待是通过使用web驱动的等待类并结合expected_conditions 来实现的。

如下所示,让我们看一个例子,其中我们将使用显式等待而不是隐式等待。

示例代码:

# python
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ExpectedCond
chromeDriver = webdriver.Chrome()
chromeDriver.get("https://inventicosolutions.com")
getElembyLinkText = WebDriverWait(chromeDriver, 10).until(ExpectedCond.presence_of_element_located((By.LINK_TEXT, "About Us")))
getElembyLinkText.click()

输出:

在Python中添加Selenium Web驱动等待

上面写的代码的超时值是10秒。Web驱动将等待10秒后抛出一个Timeout Exception

应用程序的网页地址(URL)和文本元素可以按照要求写在给定的代码中。

Web驱动的等待(正在用于显式等待的工具之一)有这个内置的质量,在每500毫秒后检查Expected Condition ,直到成功找到文本。

Python中等待的预期条件

这些条件在自动化网络浏览器时最常使用,并且在网络驱动中被预先定义。这些条件包括:

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

我们可以通过导入以下库在我们的代码中包含这些预期条件。

# python
from selenium.webdriver.support
import expected_conditions as ExpectedCond

Python中的自定义等待条件

当上述方法都不能满足用户的要求时,就可以创建自定义等待条件。自定义条件是使用一个带有call() 方法的类来创建的。

如下所示,让我们通过一个例子,我们将创建一个自定义条件,并尝试让我们的程序等待几秒钟。

示例代码:

# python
class ElementWithClass(object):
    def __init__(self, location, className):
        self.location = location
        self.className = className
    def __call__(self, ChromeDriver):
        findElem = ChromeDriver.find_element(*self.location)
        if self.className in findElem.get_attribute("class"):
            return findElem
        else:
            return False
        wait = WebDriverWait(ChromeDriver, 10)
        findElem = wait.until(element_has_css_class((By.ID, 'myId'), "myClass"))

如果元素被找到,这段代码将给用户一个true ,否则返回一个false

所以我们已经讨论了在Python中添加等待的不同方法和一些例子。我们希望你喜欢这个话题,并从中学到一些东西。