分享

您需要了解的有关Selenium等待方法

 软件测试test 2020-06-22


在编写第一个Selenium程序时,您可能会遇到等待命令。但是,您知道Selenium到底 在等待什么吗?好吧,Selenium等待是执行测试用例所需的基本代码。在本文中,我将为您简要介绍实践中广泛使用的不同类型的等待命令。

什么是Selenium等待? 

等待可以帮助用户在重定向到其他网页时解决问题。这可以通过刷新整个网页并重新加载新的Web元素来实现。有时,也可能会有Ajax调用。因此,在重新加载网页并反映Web元素时可以看到时间滞后。

通常会发现用户来回浏览各种网页。因此,由WebDriver提供的navigation()命令/方法可帮助用户通过参考Web浏览器的历史记录在网页之间进行导航来模拟实时场景。

为什么需要在Selenium中等待?

大多数Web应用程序都是使用Ajax和Javascript开发的。当浏览器加载页面时,我们要与之交互的元素可能会在不同的时间间隔加载。这样,不仅很难识别元素,而且如果找不到元素,也会抛出“ ElementNotVisibleException ”异常。通过使用Waits,我们可以解决此问题。

现在,让我们进一步了解不同类型的等待。

等待类型

Selenium支持两种类型的等待,它们如下

  1. 隐式等待

  2. 显式等待

注意: 最广泛使用的等待是隐式和显式等待,对于实时项目,流利等待不是首选。

首先,让我们了解Selenium中的隐式等待是什么

隐式等待

隐式等待将告诉Web驱动程序等待一段时间,然后抛出“无此类元素异常”。隐式等待的默认设置为零。一旦设置了时间,Web驱动程序将在抛出异常之前等待特定的时间。

语法:driver.manage()。timeouts()。implicitlyWaitTimeOutTimeUnit.SECONDS);

让我们以隐式等待为例,了解其工作原理。 

package Edureka;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait; public class ImplicitWait{public static void main(String[] args) throws InterruptedException{System.setProperty("webdriver.chrome.driver", "C:Selenium-java-edurekachromedriver_win32chromedriver.exe");WebDriver driver = new ChromeDriver();driver.manage().window().maximize();driver.manage().deleteAllCookies();driver.manage().timeouts().pageLoadTimeout(40TimeUnit.SECONDS); // 页面加载超时driver.manage().timeouts().implicitlyWait(20TimeUnit.SECONDS);    // 隐式等待20秒driver.get("https://login.yahoo.com/");driver.findElement(By.xpath("//input[@id='login-username']")).sendKeys("edureka@yahoo.com"); //查找元素并发送值Thread.sleep(1000);driver.findElement(By.xpath("//input[@id='login-signin']")).click(); //如果元素位于}}

在上面的代码中,我将隐式等待时间设置为20秒,这意味着特定元素加载或到达输出的最大等待时间为20秒。

注意:  隐式等待是全局应用的,这意味着整个驱动程序实例中的所有Web元素始终可以使用它。这意味着如果驱动程序正在与100个元素进行交互,则隐式等待适用于所有100个元素。

这全都与隐式等待有关。现在,深入研究等待并了解什么是显式等待。

显式等待

这是动态等待的概念,它  动态地等待  特定条件。可以通过WebDriverWait 实现要了解Selenium Webdriver中的显式等待,您应该知道为什么我们在程序中使用等待语句的要求。我将为您提供一些示例,在这些示例中,您将完全理解为什么Selenium中的等待很重要。

Selenium Web驱动程序中显式等待的条件

条件1 –  假设我有一个具有某些登录表单的网页,并且登录后需要花费很多时间来加载“帐户”页面或“主页”。该页面是动态的,这意味着有时需要10秒才能加载主页,有时需要15秒,依此类推。在这种情况下,“显式等待”可以帮助我们等待直到没有特定页面。

条件2 – 您正在使用旅行应用程序,并且已填写Web表单并单击了提交按钮。现在,您必须等待,直到不显示特定数据。在这种情况下,您可以再次使用“显式等待”,在其中可以进行等待,直到不显示特定元素或元素集。

语法:  WebDriverWait wait=new WebDriverWait(WebDriveReference,TimeOut);

在以上语法中,我创建了一个WebDriver wait对象,并将驱动程序引用和超时作为参数传递。这就是您需要编写“显式等待”的方式。现在让我们举个例子,了解显式等待的工作原理。让我们看一下下面的代码。

package Edureka;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait; public class Locators {public static void main(String[] args) throws InterruptedException {System.setProperty("webdriver.chrome.driver", "C:Selenium-java-edurekachromedriver_win32chromedriver.exe");WebDriver driver = new ChromeDriver();driver.manage().window().maximize();driver.manage().deleteAllCookies();driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);driver.get("https://www./");WebElement firstname= driver.findElement(By.name("firstname"));WebElement lastname= driver.findElement(By.name("lastname"));sendKeys(driver, firstname, 10, "Edureka");sendKeys(driver, lastname, 20, "Edureka");WebElement forgotAccount= driver.findElement(By.linkText("Forgotten account?"));clickOn(driver,forgotAccount, 10);driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);}public static void sendKeys(WebDriver driver1, WebElement element, int timeout, String value){new WebDriverWait(driver1, timeout).until(ExpectedConditions.visibilityOf(element));element.sendKeys(value);}public static void clickOn(WebDriver driver1, WebElement element, int timeout){new WebDriverWait(driver1, timeout).until(ExpectedConditions.elementToBeClickable(element));element.click();}}

在上面的示例中,我使用了facebook注册凭据,并使用名称定位器定位了它们。此外,我创建了一个实用程序或一个泛型函数,可用于所有元素提供显式等待。在上面的示例中,我编写了自己的sendKeys()方法。此方法将在特定的文本字段中输入值,但在内部它还将提供显式等待。sendKeys()方法内部,我给出了Element可见性的期望条件。即我要驱动程序等待20秒,直到元素的预期状态可见。此外,如果满足条件,则可以将sendKeys()应用于该方法。现在,说我想输入我的名字和姓氏。我会做的是,我将使用此sendKeys()方法并将驱动程序,名字,超时(即10秒和值传递给edureka。姓氏也是如此。

当您执行该程序时,Chrome驱动程序将启动Google Chrome浏览器并浏览,然后输入代码中提到的值。不必明确设置等待特定值的超时,根据您的要求可以更改它。这是使用显式等待的主要优点,但是对于隐式等待,一旦定义了10秒,它将适用于网页上的所有元素,并且无法修改。同去与clickOn()方法为好。但是,此方法仅对网页上的链接有用。 这是您可以使用显式等待的方式。

注意: 隐式,显式和流畅的等待是动态等待。什么是动态等待?考虑一种情况,您将TimeOut值设置为20秒。如果元素在5秒钟内加载,则其余15秒钟将被忽略。它不会等到超时值完成(即20秒)。这就是为什么所有等待都被视为动态等待的原因。

让我们进一步介绍一下隐式等待和显式等待。

隐式与显式等待

隐式等待显式等待
1.隐式等待时间应用于脚本中的所有元素1.显式等待时间仅适用于用户指定的那些元素
2.在隐等待,我们需要 指定元素的“ExpectedConditions”被定位2.在“显式等待”中,我们需要在要定位的元素上指定“ ExpectedConditions”
3.建议在隐式等待中指定的时间范围内放置元素时使用3.建议在元素需要较长时间加载时使用,并且还建议用于验证元素的属性,例如(visibilityOfElementLocated,elementToBeClickable,elementToBeSelected)

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多