当前位置: 首页 > 知识库问答 >
问题:

SeleniumWebDriver中的无限等待

公风史
2023-03-14

我实际上有三个问题:

  1. Selenium WebDriver如何实现此驱动程序。管理()。超时()。pageLoadTimeout(-1,时间单位为秒)

因为我们不能给无限睡眠的线程一个负值。

    WebDriver driver=new FirefoxDriver(fb, fp);
    driver.get("http://www.google.com");
    String str="'Feeling Lucky'";
    driver.manage().timeouts().pageLoadTimeout(-1, TimeUnit.SECONDS)
    //driver.findElement(By.xpath(".//span[contains(text(),"+str+")]")).click();
    while(true)
    {
        try
        {
            driver.findElement(By.xpath(".//span[contains(text(),"+str+")]")).click();
            break;
        }
        catch(Exception e)
        {
            Thread.sleep(500);
        }
    }
    driver.quit();

有没有更好的方法来实现无限等待?

我们在SeleniumWebDriver文档中看到了这一点

    /**
     * Sets the amount of time to wait for a page load to complete before throwing an error.
     * If the timeout is negative, page loads can be indefinite.
     *
     * @param time The timeout value.
     * @param unit The unit of time.
     * @return A Timeouts interface.
     */
    Timeouts pageLoadTimeout(long time, TimeUnit unit);

共有2个答案

贺栋
2023-03-14

您好,如果您创建了等待方法并将其保存在项目中,您可以在任何时间和任何地方使用该等待方法,这是自定义方法

 private static WebElement waitForElement(By locator,int timeout)
{
    WebElement element=new WebDriverWait(driver,timeout).until(ExpectedConditions.presenceOfElementLocated(locator));
    return element;
}

例如,如果您想要等待元素id,您可以按如下所示行代码

**waitForElement(By.id(""),20);**

这里是20毫秒,您可以在这里使用任何时间和webelement

易镜
2023-03-14

我建议您添加自己的findElement()方法,而不是试图欺骗Selenium。

免责声明:我全心全意地建议你不要这样做。等待是有原因的。如果您有无限的等待时间,那么如果您在出现问题时不手动干预,您的测试将永远运行。相反,我建议将其设置为一个非常高的数字,但不是无限的。

你可以这样做:

WebElement findElement(By by) {
  int attempts = 0;
  while (attempts > 300)
    try {
      return driver.findElement(by);
    } catch (Exception e) {
      Thread.sleep(500);
      attempts++;
    }
  }
}

没有必要在那里有无限的循环。

再一次,我不建议做以上的事情!我只是提供给你这个解决方案,因为这是你明确要求的。

你可以做的另一件事是,如果你真的想设置一个大的等待:

driver.manage().timeouts().pageLoadTimeout(300, TimeUnit.SECONDS)

那是300秒。。。即使对我来说,这也是非常令人讨厌的,不应该放进去。网页加载不应花费300秒。如果确实如此,那么您还需要修复一些其他问题(;)

 类似资料:
  • 有没有更好的写法呢?由于某种原因,我真的需要这个循环吗?(似乎与有关)

  • 问题内容: 今天,当我使用Selenium WebDrive时,出现错误。我的平台是mac osx。这是我的异常日志。 我不知道为什么会这样。我的Firefox路径是默认路径。谢谢您的帮助!! 问题答案: WebDriver使用端口7054(“锁定端口”)作为互斥体,以确保我们不会同时启动两个Firefox实例。您创建的每个新实例将在启动浏览器之前等待互斥体,然后在浏览器打开后立即释放互斥体。 因

  • 我有一段非基于演员的代码,它将一些操作委托给akka演员,我想无限期地等待这个演员的响应,我的意思是,直到这个演员返回一个响应,无论需要多长时间。问题是我不知道如何在未来无限期地等待attern.ask和wait.result方法。 我更喜欢这样的东西: 但这不起作用,因为Timeout不接受Duration对象作为构造函数参数,它只接受FiniteDuration对象。。。 任何想法? 干杯

  • 我有这样的代码: 我知道这不是做这件事的正确方法。以下是我认为可能是正确的方法: 不过,我只是想知道,为什么在运行第一个代码示例时,它会无限期地挂在上?此时代码执行到底发生了什么,即当线程在上阻塞时,什么代码“正在运行”?

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循

  • 问题内容: 我是Go的新手,来自Node.JS。 在Node中,如果我运行此命令: 由于超出了最大调用堆栈大小,程序将崩溃。 如果我在Go中这样做: 这将运行并打印到标准输出。 我的问题是: 有没有超过我给出的Go示例失败的最大呼叫数量? 这样的代码在Go中是反模式吗? 问题答案: 在Go中,goroutines没有固定的堆栈大小。取而代之的是,它们从很小的大小开始(大约为4KB),并在需要时增大