首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Selenium正确配置隐式/显式Waits和pageLoadTimeout?

如何通过Selenium正确配置隐式/显式Waits和pageLoadTimeout?
EN

Stack Overflow用户
提问于 2018-05-24 21:33:00
回答 3查看 4.3K关注 0票数 2

我目前有以下设置,但我不确定我的等待(隐式和pageLoadTimeout)是否有效。--这是正确的实现吗?通过将它放在@(“@setup”)中,它对每个场景或步骤定义运行都有效吗?司机会相应地等待吗,每次我打电话给@Given,@When..etc?

代码语言:javascript
复制
@Before("@setup")
    public void setUp() {

        driver.manage().deleteAllCookies();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);


    }

为什么有必要为下面的等待分配一个WebElement,WebElement元素收到了什么?这样做对吗?-

代码语言:javascript
复制
 WebDriverWait wait = new WebDriverWait(driver, 30);
 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();
EN

回答 3

Stack Overflow用户

发布于 2018-05-25 07:56:20

implicitlyWait()

implicitlyWait()是告诉WebDriver实例,即驱动程序在试图查找一个或多个元素(如果它们不是立即可用的话)时轮询HTML DOM一段时间。默认等待配置设置为。一旦设置,隐式等待就会被设置为WebDriver对象实例的生命周期。

您的代码测试非常完美,如下所示:

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

在这里,您将在在selenium中使用隐式等待中找到详细的讨论。

pageLoadTimeout()

pageLoadTimeout()将timespan设置为在抛出错误之前等待页面加载完成。

您的代码测试非常完美,如下所示:

代码语言:javascript
复制
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);

在这里,您可以在硒中的pageLoadTimeout不起作用中找到详细的讨论

备注:尽量避免配置pageLoadTimeout(),直到并且除非测试规范明确提到了相同的内容。

为什么是WebDriverWait?

现代浏览器使用JavaScript阿贾克斯React Native,其中网页中的元素被加载为阿贾克斯。因此,在继续执行下一行代码显式等待 (即WebDriverWait )之前,等待满足特定条件是前进的方式。

备注:根据显性和隐式Waits的官方文档,不要将隐式和显式等待混为一谈。这样做会导致不可预测的等待时间。

您的代码试用版非常适合等待元素的可见性,如下所示:

代码语言:javascript
复制
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));

在这里您可以找到关于用显式等待替换隐式等待(selenium & java)的详细讨论。

你的具体问题

  • 为什么有必要为以下等待分配一个WebElement : WebDriverWait与ExpectedConditions一起不仅返回WebElement,而且取决于ExpectedConditions也可以返回WebElement、布尔值和列表。
  • WebElement元素接收到了什么?:根据您使用ExpectedConditions作为visibilityOfElementLocated()的代码块,一旦元素在网页的DOM树上显示为,并且是可见,那么WebElement将被返回。可见性意味着元素不仅是显示的,而且具有比更大的高度和宽度。
  • 这是正确的实现吗?:您的实现近乎完美,但最后一行代码(即boolean status = element.isDisplayed(); )是多余的,因为一旦元素是可见的,visibilityOfElementLocated()就返回该元素(也就是说,元素不仅显示,而且高度和宽度大于)。
票数 6
EN

Stack Overflow用户

发布于 2018-05-25 08:25:26

如果您刚刚开始使用selenium,这是一个合法的问题。我总是建议去看看官方医生

一个隐含的等待是告诉WebDriver在试图查找一个或多个元素(如果它们不是立即可用的话)时,对DOM进行一定时间的轮询。默认设置为0。一旦设置,隐式等待就会被设置为WebDriver对象实例的生命周期。

示例:

代码语言:javascript
复制
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));

在这种情况下,如果在尝试定位时,带有id myDynamicElement的web元素不在DOM中,则需要重试到10秒。轮询时间取决于您正在使用的webdriver。您必须知道的是,它将尝试在10秒内找到元素。当然,如果元素在这段时间结束之前被定位,那么代码将继续进行。否则,将引发异常。

显式等待是指在代码中进一步进行之前,您定义的等待某个条件发生的代码。最坏的情况是Thread.sleep(),它将条件设置为等待的确切时间。有一些方便的方法可以帮助您编写只在需要时等待的代码。WebDriverWait与ExpectedCondition的结合是实现这一目标的一种方法。

示例:

代码语言:javascript
复制
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

这将在抛出TimeoutException之前等待10秒,或者如果它找到该元素,则将在0-10秒内返回它。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回为止。ExpectedCondition函数类型的成功返回值是真的布尔值,或非空对象。

最后是这样写的:这个例子在功能上也等同于第一个隐式Waits示例.

因此,如果您使用presenceOfElementLocated作为预期条件(对于您试图定位的每个元素),则使用隐式等待完全相同。但这不仅仅是条件。从ExpectedConditions中可以看到,您可以指定其他条件(例如: elementToBeClickable、stalenessOf等)。

所以,回到你的问题:

使用

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

您是说等待,,每当尝试找到a元素,presence (记住,它就像presenceOfElementLocated),直到30秒。

使用

代码语言:javascript
复制
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);

您设置为30秒,即网页需要加载的时间。

通过以下方式:

代码语言:javascript
复制
 WebDriverWait wait = new WebDriverWait(driver, 30);
 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();

您是说您想要等待带有id:"id“的web元素的visibilityOfElementLocated,,直到30秒。

最后:

为什么有必要为下面的等待分配一个WebElement,WebElement元素收到了什么?这是正确的实施吗?

WebElement元素接收到什么?如果没有id,还有什么?当然,如果它是可见的。否则,将引发异常。

票数 2
EN

Stack Overflow用户

发布于 2018-05-24 23:52:22

在这种情况下,您只需要等待页面加载,您的实现就可以了。@ one是Cucumber Hooks之一,它意味着您的方法将在每个场景之前运行。我建议使用fluent wait而不是webdriverwait,原因如下:

当使用FluentWait实例时:

  1. 您可以检查定义的条件(可见性、不可见性.)
  2. 在搜索页面上的元素时,忽略等待的特定类型的异常,例如NoSuchElementExceptions或StaleElementException。
  3. 可以为每个条件指定轮询和超时。

例如:

代码语言:javascript
复制
 // Waiting 30 seconds for an element to be present on the page, checking for its presence once every 5 seconds. 

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(30, SECONDS) .pollingEvery(5, SECONDS).ignoring(NoSuchElementException.class);

希望我帮了你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50518467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档