从渲染器接收消息超时:通过Selenium和Java在使用ChromeDriver和Chrome的windows之间切换时发生300.000错误
我对selenium 3.13.0和chrome 79.0.3945.130版以及java有一个问题。我写这段代码是为了测试一个必须在两个窗口之间切换的网页。当我开始运行这个脚本时,一切正常,但当驱动程序切换到新窗口时,它似乎不再可用!过了很长一段时间,我犯了这个错误。 有人知道问题出在哪里吗 (我确信程序的控制将从循环中出来并切换到新窗口,但在驾驶员看来,在离开循环后,它将丢失。) 某些函数,如driver.quit()或driver.getWindowHandles()在退出循环后工作,但另一些函数,如driver.getPageSource()或driver.manage().window().maximize()不工作并导致此错误 以下是我的示例代码:从渲染器接收消息超时:通过Selenium和Java在使用ChromeDriver和Chrome的windows之间切换时发生300.000错误,java,selenium,google-chrome,selenium-webdriver,selenium-chromedriver,Java,Selenium,Google Chrome,Selenium Webdriver,Selenium Chromedriver,我对selenium 3.13.0和chrome 79.0.3945.130版以及java有一个问题。我写这段代码是为了测试一个必须在两个窗口之间切换的网页。当我开始运行这个脚本时,一切正常,但当驱动程序切换到新窗口时,它似乎不再可用!过了很长一段时间,我犯了这个错误。 有人知道问题出在哪里吗 (我确信程序的控制将从循环中出来并切换到新窗口,但在驾驶员看来,在离开循环后,它将丢失。) 某些函数,如driver.quit()或driver.getWindowHandles()在退出循环后工作,但另
public class myClassFirst {
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver","Driver_Path");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize(); //it works correctly
driver.get("Web_page_Url");
Thread.sleep(15000); //to load page
System.out.println("finish waiting ...");
/*
some script here
*/
// go to appropriate frame
driver.switchTo().defaultContent();
driver.switchTo().frame("Faci3");
driver.switchTo().frame(driver.findElement(By.name("Commander")));
Set<String> s = driver.getWindowHandles();
System.out.println(s); //print windowID of current window(1)
//select button element
WebElement prepareToPrint = driver.findElement(By.id("PreparePrint"));
prepareToPrint.click();
Thread.sleep(5000); //to load new window(2)
String sThis = driver.getWindowHandle(); //get windowID of current window(1)
for (String winId:driver.getWindowHandles()) {
if (!winId.equals(sThis)) {
driver.switchTo().window(winId); //switch to new window(2)
System.out.println(winId); //print windowID of new window(2)
break;
}
}
System.out.println("exit from the loop");
driver.manage().window().maximize(); //From here does not work anymore(real line 92)
Actions builder = new Actions(driver);
builder.contextClick().perform();
System.out.println("End = Finish");
driver.quit();
}
}
试试这个
driver.switch to().window(window.manage().window().maximize()此错误消息
[1579772104.277][SEVERE]: Timed out receiving message from renderer: 300.000
[1579772104.280][SEVERE]: Timed out receiving message from renderer: -0.003
Exception in thread "main" org.openqa.selenium.TimeoutException: timeout
(Session info: chrome=79.0.3945.130)
Build info: version: '3.13.0', revision: '2f0d292', time: '2018-06-25T15:32:14.902Z'
.
.
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 79.0.3945.130, chrome: {chromedriverVersion: 79.0.3945.36 (3582db32b3389..., userDataDir: C:\Users\Sadell\AppData\Loc...}, goog:chromeOptions: {debuggerAddress: localhost:61628}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
…表示ChromeDriver无法切换到新的选项卡
您的主要问题是所使用的二进制文件版本之间的不兼容,如下所示:
- 您正在使用chromedriver=79.0.3945.36和chrome=79.0.3945.130,并且是兼容的
- 但是,您的Selenium客户端版本是2018-06-25T15:32:14.902Z的3.13.0,比它早了2年
解决方案 确保:
- JDK已升级到当前级别
- 硒被提升到当前水平
- ChromeDriver已更新到当前级别
- Chrome更新到当前的Chrome 79.0版本。(根据)
- 通过IDE清理项目工作区,并仅使用所需的依赖项重建项目 亲爱的 在这个问题上,我将我的web驱动程序从chrome改为firefox,暂时解决了这个问题。
我希望这也能对您有所帮助。默认情况下,Selenium WebDriver会等待页面完全加载。但是,您可以告诉它不要,或者使用另一种PageLoadStrategy 以下内容应该对您有所帮助
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
当我使用EdgeDriver解决同样的问题时,这篇文章帮助了我 @DebanjanB先生,首先,感谢您的关注,我尝试了这个解决方案,但重复了同样的结果。我确信程序的控制将从循环中出来并切换到新窗口,但在驱动程序看来,在离开循环后将丢失。@Sr7这应该是一个不同的问题,并且有不同的标准答案。你能更新我这个答案的状态吗?我更新了我问题的代码以更好地显示发生了什么。我使用的是java版本“1.8.0_181”。你认为问题在这里吗@DebanjanB@Sr7181应该可以,因为我仍然使用171。更好地升级到231Dear@DebanjanB我将jdk更新到241版,但问题仍然存在。
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);