Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要Thread.sleep()的替代解决方案;_Java_Multithreading_Selenium_Selenium Webdriver - Fatal编程技术网

Java 需要Thread.sleep()的替代解决方案;

Java 需要Thread.sleep()的替代解决方案;,java,multithreading,selenium,selenium-webdriver,Java,Multithreading,Selenium,Selenium Webdriver,我使用的是SeleniumWeb驱动程序,我认为该体系结构是由SeleniumIDE组件设计的,并且为其他事件实现了核心java方法。 我现在面临的主要问题是,我必须根据互联网的速度来设计我的脚本,大多数时候脚本会因为超时错误而崩溃 为了克服这个问题,我正在实现线程;java方法。 但有了这个解决方案,系统自动化的速度变慢了,系统不得不等到线程完成计时器 因此,我需要一个优化的解决方案来解决这个问题,就像一个方法,它将保持进一步的行动,直到完整的页面加载 不要一根大线。睡觉,希望下一根线在你完成

我使用的是SeleniumWeb驱动程序,我认为该体系结构是由SeleniumIDE组件设计的,并且为其他事件实现了核心java方法。 我现在面临的主要问题是,我必须根据互联网的速度来设计我的脚本,大多数时候脚本会因为超时错误而崩溃

为了克服这个问题,我正在实现线程;java方法。 但有了这个解决方案,系统自动化的速度变慢了,系统不得不等到线程完成计时器


因此,我需要一个优化的解决方案来解决这个问题,就像一个方法,它将保持进一步的行动,直到完整的页面加载

不要一根大线。睡觉,希望下一根线在你完成后准备好,你可以把它分成几次重试

因此,使用伪代码代替:

doSomething();
Thread.sleep(5000);
doNextThing(); //Let's hope we're ready at this point...
你可以做:

doSomething();
for(int i=0; i < 5; i++)
{
    if(isNextBitReady()) 
    {
        break;  //Yay! Give up sleeping and carry on
    }
    else
    {
        Thread.sleep(1000);  //Sleep a little bit and try again
    }
}
doNextThing();

这意味着您的等待时间通常会更短,但如果某次跑步速度较慢,您仍然有一个安全网。您可以平衡重试次数和睡眠时间,以获得更细粒度的检查。

您还可以尝试等待浏览器提供是否加载页面的代码

objExecutor = (JavascriptExecutor) objDriver;
if (!objExecutor.executeScript("return document.readyState").toString()
    .equalsIgnoreCase("complete")){
    Thread.sleep(100);
}
你可以简单地把它放在你的基本页面上,这样你就不需要把它写在每个页面对象上。我从未在任何支持AJAX的站点上尝试过,但这可能会帮助您,您的场景依赖性也会消失

我更喜欢使用Selenium的FluentWait API。通过使用它,您可以另外设置最大等待时间。withTimeout,也可以忽略某些异常。当您使用FluentWait搜索页面上的元素时,这一点尤为重要:

public void waitUntilDocumentIsReady() {
    Wait<WebDriver> wait = new FluentWait<>(this.webDriver())
            .withTimeout(25, TimeUnit.SECONDS)
            .pollingEvery(1, TimeUnit.SECONDS)
            .ignoring(UnhandledAlertException.class);

    wait.until(new Function<WebDriver, Boolean>() {
        @Override
        public Boolean apply(WebDriver f) {
            return ((JavascriptExecutor) f).executeScript("return document.readyState").equals("complete");
        }
    });

从Selenium文档中,您可以使用隐式等待:

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"));

这将告诉驱动程序在失败前最多等待10秒,但它将自动循环以查看结果是否在失败前准备好。如果准备就绪,则该方法将继续,而不等待10秒。请不要为整个selenium脚本设置值。

我的想法大致相同,唯一的问题是是否有某种isNextBitReady方法可用?Mohit,您可以在WebDriver中找到大量用于同步的线程。你可以用implicitWait和WebDriverWait搜索它。这两个比Thread.Sleep.你好Uday,实际上,我不想在预定义的时间内保持脚本执行。相反,我正在开发一个解决方案,该解决方案将为我提供如下功能:-自动化脚本应暂停,直到整个页面和该页面上的所有事件加载。如果可能,请提供此问题的解决方案。