分类
文章

Selenium WebDriver在Python中等待示例解释

本教程将指导您了解Selenium Webdriver等待(隐式和显式等待)的概念以及如何在Python中使用它们。

如果您正在Selenium Python中进行自动化并且希望编写无错误的脚本,那么您必须学习使用等待。它们让您处理可能发生的任何意外情况。

在自动化Web应用程序时,您打算编写一个可以执行以下任务的脚本。

单击此处返回Selenium Python主教程。

  • 加载浏览器,
  • 打开网站,
  • 找到元素,并
  • 执行所需的操作。

但是,由于以下原因,测试脚本有时可能会失败。

  • Web元素不存在,因为由于运行时问题而无法加载。
  • 在Web应用程序中使用AJAX技术带来了不确定性,因为Web页面及其中存在的Web元素的加载可能会在不同的时间跨度内发生。
  • 很多时候,由于流量峰值或网络延迟,我们的应用程序的行为可能与正常最佳条件下的行为有所不同。

在这些情况下,我们需要等待时间以允许Web元素完全加载,然后再在测试中使用它们。Webdriver API提供了两种类型的等待机制来处理这种情况。我们将详细讨论这些等待条件。

Selenium Webdriver在Python中等待

Selenium Webdriver等待的两种类型是:

  • 隐式等待
  • 显式等待
隐式等待

隐式等待会导致WebDriver在尝试查找不立即可见的元素时轮询DOM一定时间(如命令中所述)。可以使用隐式等待设置的默认时间值为零。它的单位是秒。隐式等待与Web元素关联,直到被销毁。

请按照下面的代码片段说明如何在Python中使用隐式等待。


from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.implicitly_wait(100)

driver.get("http://google.com")
driver.maximize_window()

print("Implicit Wait Example")

inputElement = driver.find_element_by_id("lst-ib")
inputElement.send_keys("NihaoW3")
inputElement.submit()

driver.close()

在上面的代码中,implicitly_wait()方法告诉Webdriver在一定时间范围内一次又一次地轮询DOM。在此示例中,超时为100秒,如果目标元素在这段时间内不可用,则将触发该超时。

我们定义了隐式等待Webdriver对象,因此它将一直处于活动状态,直到该对象存在。

显式等待

在某些情况下,等待时间不确定。明确地在那里等待救世主的工作。在这里,我们可以定义某些条件,只有在满足此条件后,Selenium WebDriver才会继续执行下一步。

显式等待是在测试脚本中实现Selenium Webdriver等待的最优选方式。它提供了灵活性,可以等待自定义条件发生,然后再进行下一步。

以下是实现显式等待所需的两个Selenium Python类。

  • WebDriverWait,和
  • Python的Expected Conditions类。

为了了解其用法,让我们以网页上的简单JavaScript警报为例。网页上存在一个按钮来触发该警报。

用例之一是单击按钮并确认它不会触发警报。在预期条件下使用显式等待WebDriver将仅等待时间,直到在屏幕上看不到Simple JavaScript。出现后,WebDriver将继续执行下一步。

但是,如果直到显式等待中定义的最大等待时间才出现警报,则Webdriver将引发”NoAlertPresentException”。

这是用于使用JavaScript生成简单警报的HTML代码。


<body bgcolor="#C0C0C0">
<h1>Simple Alert Demonstration</h1>
<p>
Press button underneath to generate an alert.
</p>
<button onclick="alertFunction()" name ="alert">Generate Alert</button>
<script>
function alertFunction() {
    alert("Hello! I'm a Simple Alert.nPlease press the 'OK' button.");
}
</script>
</body>
</html>

您需要将此文件保存在计算机上,并将其命名为’Simple_Alert。HTML。”

以下是演示显式等待的代码段。


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 cond
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import TimeoutException

driver = webdriver.Firefox()
driver.maximize_window()
#location = "file://<Specify Path to Simple_Alert.HTML>"
location = "file://C:/Users/Automation-Dev/Desktop/Meenakshi/Selenium%20Python/Simple_Alert.HTML"
driver.get(location)

#Press the "Alert" button to demonstrate the Simple Alert
button = driver.find_element_by_name('alert')
button.click()

try:
    # Wait as long as required, or maximum of 10 sec for alert to appear
    WebDriverWait(driver,10).until(cond.alert_is_present())

    #Change over the control to the Alert window
    obj = driver.switch_to.alert

    #Retrieve the message on the Alert window
    msg=obj.text
    print ("Alert shows following message: "+ msg )
    
    #Use the accept() method to accept the alert
    obj.accept()

except (NoAlertPresentException, TimeoutException) as py_ex:
    print("Alert not present")
    print (py_ex)
    print (py_ex.args)
finally:
    driver.quit()

在上面的脚本中,超时值为10秒。这意味着Webdriver将等待10秒钟,然后抛出TimeoutException。
如果存在该元素,则它可能会在0到10秒内返回。默认情况下,WebDriverWait API每500毫秒执行一次ExpectedCondition,直到成功返回为止。

如果ExpectedCondition匹配,则返回值将为布尔值(TRUE),而对于所有其他ExpectedCondition类型,返回值将为非null。

标准预期条件

没有。自动化网页时通常会遇到的标准条件。下面是显示每个名称的列表。所有这些类都可以在”selenium.webdriver.support.expected_conditions” Python模块中找到。

  1. class alert_is_present
    它允许等待警报出现。
  2. class element_located_selection_state_to_be(ui_locator,is_selected)
    它允许等待具有指定状态的元素的定位。
  3. class element_located_to_be_selected(ui_locator)
    它允许等待元素处于选定状态。
  4. class element_selection_state_to_be(ui_element,is_selected)
    它允许等待查找具有指定状态的元素。
  5. class element_to_be_clickable(ui_locator)
    它允许等待元素处于可点击状态的位置。
  6. class element_to_be_selected(ui_element)
    它允许等待元素查找处于选定状态的元素。
  7. class frame_to_be_available_and_switch_to_it(ui_locator)
    它允许等待帧变为可用于切换。
  8. class invisibility_of_element_located(ui_locator)
    它允许等待DOM中不可见或不可见的元素。
  9. staleness_of(ui_element)类
    它允许等待元素从DOM中删除。
  10. class text_to_be_present_in_element(ui_locator,inner_text)
    它允许等待元素与给定文本一起找到。
  11. class text_to_be_present_in_element_value(ui_locator,value)
    它允许等待元素在定位器内查找具有给定文本的元素。
  12. class title_contains(title_text)
    它允许等待查找包含区分大小写格式的指定文本的标题。
  13. class title_is(title)
    它允许等待查找与指定文本完全匹配的标题。
  14. 类的能见度(ui_element)
    它允许等待查找功能上可见的元素。
  15. 可见性类别_all_elements_located(ui_locator)
    它允许等待查找指定定位符将返回的所有功能上可见的元素。
  16. class visible_of_any_elements_located(ui_locator)
    它允许等待查找指定定位符将返回的至少一个功能上可见的元素。
  17. class visible_of_element_located(ui_locator)
    它允许等待查找指定定位符将返回的特定且功能上可见的元素。

在Selenium Python绑定中,您可以轻松地找到处理这些方法的方法。它使您不必编写任何用户定义的预期条件类或为其创建包。

快速总结– Selenium Webdriver在Python中等待

了解Selenium Webdriver等待是生成高质量自动化测试脚本的关键。我们希望本教程将指导您采用正确的方法。

发表评论

电子邮件地址不会被公开。 必填项已用*标注