在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()
输出:
从上面的例子可以看出,在加载页面后,它正好等待了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()
输出:
上面写的代码的超时值是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中添加等待的不同方法和一些例子。我们希望你喜欢这个话题,并从中学到一些东西。