gpt4 book ai didi

javascript - 在接受警报 Selenium Webdriver 之前等待页面加载

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:55 24 4
gpt4 key购买 nike

我正在尝试进行一些基本的网络爬行,并且希望能够接受(或忽略)屏幕上的任何警报,以便我可以访问页面元素。早些时候,我通过预期的等待警报来管理此问题。

private void handleAlert(){
try{
WebDriverWait wait = new WebDriverWait(driver, 2);
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
Logger.log("Accepting alert~!~~~~!!!");
}catch(NoAlertPresentException e){
// Do nothing :D
}catch(UnhandledAlertException e){
Logger.writeError("An alert was not handled!");
}catch(TimeoutException e){
Logger.writeError("There was a timeout occurring handling alert");
}
}
}

但是,如果页面在前 2 秒内未加载但随后加载(我的页面加载超时为 15 秒),则存在问题。在这种情况下,存在警报,但我将不再尝试忽略/接受此警报。

为了解决这个问题,我决定编写一些代码,等待页面加载,然后再尝试处理警报。代码如下:

    /**
* Load an Url in the chrome browser via Selenium driver
* @param url: The web address to be crawled
* @throws InterruptedException
*/
public boolean loadUrl(String url) throws InterruptedException{
try{
driver.get(url);
waitTillPageLoads();
handleAlert();
return true;
}catch(TimeoutException e){
//e.printStackTrace();
Logger.writeError("There was a timeout for the url: "+url);
return false;
}
}

/**
* Use webdriver expected conditions override to wait until
* DOM state is completed
*/
private void waitTillPageLoads(){
ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>()
{
public Boolean apply(WebDriver driver)
{
return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
}
};
Wait<WebDriver> wait = new WebDriverWait(driver,30);
wait.until(expectation);
}

但是,如果我这样做,我会收到一个 AlertNotHandledException,如下面汇总的堆栈跟踪所示:

Exception in thread "main" org.openqa.selenium.UnhandledAlertException: unexpected alert open
Session ID: 876c48f2d94d10fe30984ab94f32884e
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:164)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:577)
at src.com.chrome.TestChromeDriver$1.apply(TestChromeDriver.java:349)
at src.com.chrome.TestChromeDriver$1.apply(TestChromeDriver.java:1)
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:238)
at src.com.chrome.TestChromeDriver.waitTillPageLoads(TestChromeDriver.java:353)
at src.com.chrome.TestChromeDriver.loadUrl(TestChromeDriver.java:364)
at src.com.chrome.TestChromeDriver.crawl(TestChromeDriver.java:308)
at src.com.chrome.TestChromeDriver.main(TestChromeDriver.java:132)

那么,我如何等待页面加载,然后尝试处理 javascript 警报(如果存在)。谢谢!

最佳答案

如果您知道自己在做什么,并且无论后果如何,确实都必须绕过所有 JavaScript 警报和对话框,那么您始终可以 follow this advice :

((JavascriptExecutor) driver).executeScript("window.alert = function() {}; window.prompt = function() {return null}; window.confirm = function() {return true}");

您需要在每个页面加载后运行它,但这肯定比尝试处理不可预测的、可变的行为更干净。

(如果您想试用它,请打开浏览器的开发者工具,将 scriptlet 粘贴到 JS 控制台,然后验证 alert('hi'); 不执行任何操作。)

关于javascript - 在接受警报 Selenium Webdriver 之前等待页面加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35846511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com