【问题标题】:Selenium is taking too much time to execute a command after handing browser authentication pop up弹出浏览器身份验证后,Selenium 执行命令花费了太多时间
【发布时间】:2016-09-09 15:18:30
【问题描述】:

我遇到了 Selenium WebDriver 的一个非常奇怪的问题。登录网站后,我们的应用程序显示一个基本身份验证弹出窗口,我已通过 AutoIT 处理。问题是页面加载后,Selenium 需要大约 80-100 秒来执行下一个命令。下一个命令可以是任何东西,我只是想在页面加载后获取浏览器的标题。在 80-100 秒内执行下一个命令后,Selenium 以正常速度执行其余命令。

知道可能是什么问题吗?我在下面添加了我的代码。

            driver.findElement(By.id("username").sendKeys("username");
            driver.findElement(By.id("password").sendKeys("passowrd");
            driver.findElement(By.id("submit").click();


            File file = new File("lib", "jacob-1.17-x64.dll"); 
            System.setProperty(LibraryLoader.JACOB_DLL_PATH,
                    file.getAbsolutePath());
            AutoItX autoIt = new AutoItX();
            Thread.sleep(2000);

            String title = "Authentication Required";


            autoIt.winActivate(title, "");
            autoIt.winWaitActive(title);
            if (autoIt.winExists(title)) {
                autoIt.send("username{TAB}", false);
                autoIt.send("password{Enter}", false);
            }

        } catch (InterruptedException ex) {
            //
        }*/

        System.out.println(driver.getTitle());       


        System.out.println(driver.findElement(By.cssSelector(".sdfsdf")).getText());
        System.out.println(driver.findElement(By.id("key")).getAttribute("placeholder"));

在上面的代码中,Selenium 需要大约 60-80 秒来执行 get Title 命令,但之后它就可以正常工作了。即使我改变了代码中命令的顺序,结果还是一样的。

【问题讨论】:

  • 您使用的是最新的 selenium chrome 驱动程序版本吗?它可能已经过时了。在这 60-80 秒之后会发生什么,页面可能会刷新?也可能是,当您调用driver.getTitle() 时,该页面尚未加载。您应该添加一些wait 条件或其他内容。
  • 我使用的是 Firefox 浏览器,不,它在页面加载后等待 60-80 秒。

标签: java selenium


【解决方案1】:

@Naseem:你怎么说页面已经加载了。?根据您提供的代码,没有条件说要等到页面加载

无论如何,如果您不等到 document.readystate 完成,我建议请使用下面的代码并尝试一下

void waitForLoad(WebDriver driver) {
    ExpectedCondition<Boolean> pageLoadCondition = new
        ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
                return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
            }
        };
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(pageLoadCondition);
}

另外,请避免使用 Thread.sleep()

如果上面的代码没有帮助,那么 AutoIT 代码一定是罪魁祸首,顺便说一句,在使用 autoIT 时,你使用的“Local Const $timeout”是什么?

在下面的博客中,提供了一个这样的 AutoIT 代码。

http://seleniummonk.blogspot.in/p/handle-upload-dialog.html

尝试其中的代码。把你的观察放在这里,看看它是否不符合你的需求

【讨论】:

  • 有了上面的函数,脚本等待wait.until(pageLoadCondition);行 80-100 秒。我也删除了 Auto IT 代码,但它的工作原理相同。我也尝试使用以下命令更改页面超时,但在 10 秒后它没有抛出任何异常。 driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
  • 尝试以下,隐式等待。 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
  • 顺便说一句,您使用的是 chrome。?据我记得,pageLoadTimeout() 没有为 chrome 实现,(在最近的版本中不确定)
  • 我也尝试过隐式等待,但它的行为与此相同。我为此使用了 FF,但是当我在 IE 中尝试相同时,它工作正常。似乎 FF 存在应用程序问题......我正在等待开发团队查看 FF 问题。感谢您的帮助:)
  • 顺便说一句,如果您从开发团队收到任何消息,请不要忘记更新帖子..
猜你喜欢
  • 1970-01-01
  • 2019-04-06
  • 2017-06-01
  • 2021-10-13
  • 2017-08-04
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多