【问题标题】:Selenium: close tricky javascript popup inside javascript codeSelenium:关闭javascript代码中棘手的javascript弹出窗口
【发布时间】:2018-01-02 11:34:51
【问题描述】:

我知道如何使用 Selenium 关闭弹出窗口,但这个非常棘手。这就是发生的事情。单击按钮后会打开此弹出窗口。 当我执行这段代码时:

WebElement button = driver.findElement(...);
log.info("step 1");
button.click();
log.info("step 2");
Alert alert = driver.switchTo().alert();
alert.accept();
WebElement nextButton = driver.findElement(...);
nextButton.click();

第 2 步部分未出现在日志中。点击后 Eclipse 冻结,但点击完成,页面上显示以下弹出窗口。

这就是我认为发生的事情。该按钮实际上具有以下 javascript onclick 代码:

continueButton();return;

现在弹出窗口在 continueButton() 函数内启动。

所以我想我的 java 代码只是在这里冻结,等待 Javascript 完成这个函数并执行上面的 return。但由于有这个弹出窗口阻止 javascript 继续运行,我实际上无法关闭窗口,因为我无法关闭窗口。如果我手动执行,第 2 步会出现在日志中,并且 java 代码执行会继续。

鉴于我无法更改页面源,有什么办法可以解决这个问题?

我尝试的是单独执行javascript部分;而不是点击:

jsexecutor.execute("continueButton();")
log.info("step 1");
Alert alert = driver.switchTo().alert();
alert.accept();
jsexecutor.execute("return;")

但这完全是在相同的行为中运行。 popup show but step 1不在日志中,所以java执行就卡住了。

【问题讨论】:

  • 您能总结一下您尝试自动化的确切手动步骤吗?通过alert.accept();接受警报后,请更新有关您将执行的下一步的问题
  • 我已经添加了下一步,虽然我从来没有真正做到过。
  • @Jefeinfiltrado,这个问题还不够清楚。这是否与此有关 - github.com/seleniumhq/selenium-google-code-issue-archive/issues/…

标签: javascript java selenium popup


【解决方案1】:

在调用 switchTo().alert() 时需要注意某些事实,然后在调用 findElement(...) 时需要注意一些事实以调用 click()强>上nextbutton。当JS Alert 被调用时,您必须等待AlertHTML 中正确呈现。同样,一旦您 AcceptAlert 您必须等待预期的按钮变为 clickable,如下所示:

log.info("step 1");
driver.findElement(By.xpath("xpathExpression_of_button")).click();
new WebDriverWait(driver,5).until(ExpectedConditions.alertIsPresent());
log.info("step 2");
driver.switchTo().alert().accept();
new WebDriverWait(driver,5).until(ExpectedConditions.elementToBeClickable(driver.findElement(By.xpath("xpathExpression_of_nextButton")))).click();

【讨论】:

  • 看到问题不是等待。如果我在这种情况下运行您的代码,第 3 行将永远不会被执行。这就是为什么我在那里放了一个日志来证明它的原因。单击第一个按钮时,整个 java 代码卡在 javascript 中。但是感谢您尝试帮助我。
  • 您始终可以根据 JS/Ajax 将时间跨度增加到最佳水平。这是最好的做法。如果JS Alert 被卡住并且无法出来,则相关的JavaScript 会出现错误。
【解决方案2】:

这终于是我的解决方案了。在单击触发弹出窗口并阻止我的代码之前,我创建了一个等待几秒钟的线程,然后获取弹出窗口并单击它的关闭按钮:

    DelayedClicker delayedClicker = new DelayedClicker(getDriver(),
            xpath, 30, log,
            EnumXpath.POPUP_WINDOW_TITLE, null);
    delayedClicker.start();
    WebElement button = getDriver()
            .findElement(...)));
    button.click();

在线程中

    Thread.sleep(delay * 1000);
    if (windowTitle != null)
        switchWindowByTitle(windowTitle);
    if (frameTitle != null)
        switchFrameByTitle(frameTitle);
    WebElement button = driver.findElement(By.xpath(xpath));
    button.click();

当然,在两个不同的线程中使用相同的 webdriver 完全是混乱的,但在这种情况下,这似乎是唯一的方法。在我的代码被阻止之前,我启动了线程。然后线程终止弹出窗口,从而解除阻塞代码并消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多