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

2020-06-24 16:21:23 浏览数 (1)

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

什么是Selenium等待?

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

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

为什么需要在Selenium中等待?

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

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

等待类型

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

  1. 隐式等待
  2. 显式等待

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

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

隐式等待

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

代码语言:javascript复制
语法:driver.manage()。timeouts()。implicitlyWait(TimeOut,TimeUnit.SECONDS);

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

代码语言:javascript复制
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(40, TimeUnit.SECONDS); // 页面加载超时
driver.manage().timeouts().implicitlyWait(20, TimeUnit.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表单并单击了提交按钮。现在,您必须等待,直到不显示特定数据。在这种情况下,您可以再次使用“显式等待”,在其中可以进行等待,直到不显示特定元素或元素集。

代码语言:javascript复制
语法:  WebDriverWait wait=new WebDriverWait(WebDriveReference,TimeOut);

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

代码语言:javascript复制
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.facebook.com/");
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浏览器并浏览facebook.com,然后输入代码中提到的值。不必明确设置等待特定值的超时,根据您的要求可以更改它。这是使用显式等待的主要优点,但是对于隐式等待,一旦定义了10秒,它将适用于网页上的所有元素,并且无法修改。同去与clickOn()方法为好。但是,此方法仅对网页上的链接有用。 这是您可以使用显式等待的方式。

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

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

隐式与显式等待

隐式等待

显式等待

1.隐式等待时间应用于脚本中的所有元素

1.显式等待时间仅适用于用户指定的那些元素

2.在隐等待,我们需要不 指定元素的“ExpectedConditions”被定位

2.在“显式等待”中,我们需要在要定位的元素上指定“ ExpectedConditions”

3.建议在隐式等待中指定的时间范围内放置元素时使用

3.建议在元素需要较长时间加载时使用,并且还建议用于验证元素的属性,例如(visibilityOfElementLocated,elementToBeClickable,elementToBeSelected)

0 人点赞