我知道如何用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完成这个功能并执行上面的返回。但是由于有这个弹出窗口阻止javascript进行,我实际上无法关闭窗口,因为我无法关闭窗口。如果我手动执行,则会在日志中显示第2步,并继续执行java代码。
有没有办法解决这个问题,因为我无法更改页面源?
我试过的是单独执行javascript部分;而不是点击:
jsexecutor.execute("continueButton();")
log.info("step 1");
Alert alert = driver.switchTo().alert();
alert.accept();
jsexecutor.execute("return;")
但这完全符合相同的行为。弹出窗口显示但步骤1不在日志中,因此java执行只是卡住了。
答案 0 :(得分:0)
您需要在调用 switchTo().alert()
时处理某些事实,然后在调用 findElement(...)
调用 {时接下来click()
上的{1}} 。调用nextbutton
JS
时,您必须等待Alert
中正确呈现Alert
。同样,一旦HTML
Accept
,您必须等待预定按钮为Alert
,如下所示:
clickable
答案 1 :(得分:0)
最后这是我的解决方案。在进行触发弹出窗口并阻止我的代码的点击之前,我创建一个等待几秒钟的线程,然后获取弹出窗口并单击它的关闭按钮:
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完全是混乱的,但在这种情况下它似乎是唯一的方法。在我的代码被阻止之前,我启动了Thread。线程然后杀死弹出窗口,从而解锁代码并消失。