如何接受不同窗口中出现的硒警报?

时间:2018-09-20 20:23:19

标签: javascript java selenium selenium-webdriver alert

方案:有2个窗口打开。当我单击第二个窗口上的按钮时,第三个窗口正在打开,焦点自动移至第三个窗口。将在第三个窗口中发出警报以接受。

问题:由于警报来自其他窗口,因此我无法接受。

发现:我认为这是硒的局限性。如果警报位于单击按钮的同一窗口中,则我们具有DOM,因此我们能够与警报进行交互。但是在这种情况下,警报位于另一个窗口中,因此浏览器的状态被锁定。

尝试过的解决方案:通过使用javascript,硒行动类等尝试了所有可能的方法,但是它不起作用。

一些尝试的方法如下

//e.click();
                        /*Actions ac = new Actions(driver);

                        ac.sendKeys(Keys.ENTER).build().perform();*/
                        String onClickScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('click', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject){ arguments[0].fireEvent('onclick');}";
                        JavascriptExecutor jse = (JavascriptExecutor)driver;
                        jse.executeScript(onClickScript, e);

                    /*  Actions asd = new Actions(driver);
                        asd.clickAndHold(e).perform();
                        Thread.sleep(1000);
                        asd.release().perform();*/

2 个答案:

答案 0 :(得分:0)

为清除某些疑问,警报是通过 JavaScript 生成的,并且绝不属于HTML DOM的一部分。

接受解雇一个警报,您必须始终诱使 WebDriverWait 来使警报成为当前如下:

import org.openqa.selenium.Alert;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
//other code
Alert myAlert = new WebDriverWait(driver, 10).until(ExpectedConditions.alertIsPresent());
//accept an alert
myAlert.accept();
//dismiss an alert
myAlert.dismiss();

答案 1 :(得分:0)

以下解决方案工作正常,可以在类似情况下使用。

我们必须使用java.awt包的Robot类。 在下面的代码中,Alt + space + c将关闭所有打开的窗口。在这里关闭警报。

public void closeAlert(String strControlName, String delayTime) {
    Robot rb;
    int timeInSec = Integer.parseInt(delayTime);
    try {
        rb = new Robot();
        rb.keyPress(KeyEvent.VK_ENTER); //for clicking on the button or link
        rb.keyRelease(KeyEvent.VK_ENTER);
        Log.info("Wait for "+timeInSec+" Secs");
        Thread.sleep(timeInSec*1000);
        rb.keyPress(KeyEvent.VK_ALT); 
        rb.keyPress(KeyEvent.VK_SPACE);
        rb.keyPress(KeyEvent.VK_C);
        rb.keyRelease(KeyEvent.VK_C);
        rb.keyRelease(KeyEvent.VK_SPACE);
        rb.keyRelease(KeyEvent.VK_ALT); 
        Log.info("Successfully clicked on '"+strControlName+ "' and closed the Alert");
    } catch (Exception e) {
        Log.info("Failed click on '"+strControlName+ "' and close the Alert");
    }


}