前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >您需要了解的有关Selenium等待方法

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

作者头像
用户7466307
发布2020-06-24 16:21:23
1.7K0
发布2020-06-24 16:21:23
举报
文章被收录于专栏:用户7466307的专栏
在编写第一个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)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试test 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Selenium等待?
  • 为什么需要在Selenium中等待?
  • 等待类型
    • 隐式等待
      • 显式等待
        • Selenium Web驱动程序中显式等待的条件
    • 隐式与显式等待
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档