方案:有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();*/
答案 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");
}
}