[原创] 解决Selenium的"failed to change window state to maximized" 窗口最大化问题

OS:Ubuntu 16.04.3 LTS
JDK:1.8.0_60
Selenium:3.0.0
Chrome:61.0.3163.100

本文描述了用JAVA编程控制Selenium时,遇到的“failed to change window state to maximized, current state is normal”错误的解决方法。

在一些自动化任务中,最大化浏览器窗口是一个非常频繁使用的功能,如果你用了 driver.manage().window().maximize() 这个方法来最大化浏览器窗口的话,有很大的机会遇到以下问题:

Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: failed to change window state to maximized, current state is normal
  (Session info: chrome=61.0.3163.100)
  (Driver info: chromedriver=2.30,platform=Linux 4.10.0-37-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 818 milliseconds
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'codelast', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.10.0-37-generic', java.version: '1.8.0_60'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.30, userDataDir=/tmp/.org.chromium.Chromium.uMCzgg}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=61.0.3163.100, platform=LINUX, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=}]
Session ID: 0f4ef7760fd6071f5aa9d31b98001663
        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:422)
        at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:216)
        at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:635)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:658)
        at org.openqa.selenium.remote.RemoteWebDriver$RemoteWebDriverOptions$RemoteWindow.maximize(RemoteWebDriver.java:882)
......
 

结果当然就是程序跑挂了。
这不是你的程序写的错,而是Selenium的一个bug。无数人都在各种网站反馈了这个问题,例如这里这里,等等。而且貌似Selenium的开发者们暂时不打算修复这个问题,因为有人发现了一些变通方案来实现浏览器窗口最大化,并且验证了不会出现上面的问题。
文章来源:https://www.codelast.com/
我这里的情况是,如下代码是有问题的:

System.setProperty("webdriver.chrome.driver", "/usr/lib/chromium-browser/chromedriver");
    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();    // maximize the browser window when it starts

这几乎肯定会触发上面所说的问题,只有运气好的少数几次不会挂。
文章来源:https://www.codelast.com/
解决办法如下:

    System.setProperty("webdriver.chrome.driver", "/usr/lib/chromium-browser/chromedriver");
    ChromeOptions options = new ChromeOptions();
    options.addArguments("start-maximized");
    WebDriver driver = new ChromeDriver(options);

经实际观察,几乎没有再出现上面的问题。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast

《[原创] 解决Selenium的"failed to change window state to maximized" 窗口最大化问题》有6条评论

  1. 无法解决啊
    public class HelloSelenium {

    public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver", "lib/chromedriver");

    ChromeOptions options = new ChromeOptions();
    options.addArguments("start-maximized");
    WebDriver driver = new ChromeDriver(options);
    // ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com/");
    // driver.manage().window().fullscreen();
    driver.manage().window().maximize();// 有bug 上述方法未解决

    WebElement text = driver.findElement(By.id("kw"));
    text.sendKeys("selenium");
    driver.findElement(By.id("su")).click();

    // driver.quit();

    }
    }

    回复

回复 learnhard 取消回复