【问题标题】:Mac selenium webdriver chrome window always starts with a small windowMac selenium webdriver chrome窗口总是以小窗口开头
【发布时间】:2023-10-30 09:08:02
【问题描述】:

我在使用 chrome 和 selenium 2 webdriver 时遇到问题。问题是,当我使用 chromedriver 启动浏览器会话时,它总是在一个小于可用屏幕宽度一半大小的窗口中启动。因为我正在对屏幕尺寸更改时更改的页面进行测试,所以我的测试失败了,因为我试图从页面顶部拖动一个元素并将其放到页面底部的一个元素中。我收到滚动错误。但是如果窗口最大化,那么我不会得到这个错误。但问题是,每次 chrome 通过 chrome 驱动程序启动一个新会话时,它总是在一个小窗口中启动。我探索了许多不同的选项来让浏览器开始最大化:

  • 通过 javascript 调用 window.resizeTo(width,height); 来更改窗口大小。但是,这不适用于更高版本的 chrome(或 firefox)。
  • 使用开关 --start-maximized 启动 chrome。这适用于 Windows,但在 mac 上不起作用。
  • 使用指定配置文件目录的开关启动 chrome。这样配置文件将定义窗口大小。 --profile-directory=~/chromeprofile 这在我从命令行启动 chrome 时有效,但如果我从 selenium webdriver/chromedriver 执行此操作,则没有任何区别。
  • 当我尝试时:driver.manage().window().setSize() 我得到了这个例外:

    INFO: Executing: [93debf43cf70ad3557442a7e1aee4620, setWindowSize {"windowHandle":"current","width":2560,"height":1440}]
    org.openqa.selenium.UnsupportedCommandException: [GET, HEAD, DELETE]
    Command duration or timeout: 16 milliseconds
    Build info: version: '2.15.0', revision: '15105', time: '2011-12-08 09:56:25'
    System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.7.2', java.version: '1.6.0_29'
    Driver info: driver.version: RemoteWebDriver
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:147)
        at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:113)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:424)
        at org.openqa.selenium.remote.RemoteWebDriver$RemoteWebDriverOptions$RemoteWindow.setSize(RemoteWebDriver.java:578)
        at com.domo.automation.framework.utility.WebDriverUtil.startWebDriver(WebDriverUtil.java:36)
        at com.domo.automation.tests.DomoWebDriverTestCase.setUp(DomoWebDriverTestCase.java:45)
        at junit.framework.TestCase.runBare(TestCase.java:132)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at junit.framework.TestSuite.runTest(TestSuite.java:243)
        at junit.framework.TestSuite.run(TestSuite.java:238)
        at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:199)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:62)
    

为了实现这一目标,我还可以探索哪些其他选项?问题是窗口太小?每次 chrome 在 mac 上通过 webdriver 启动时,我该怎么做才能自动最大化窗口?

【问题讨论】:

    标签: java selenium webdriver


    【解决方案1】:

    driver.manage().window().setSize() 目前无法与 ChromeDriver 一起使用(从 v19 开始)。有一个与此功能请求相关的active chromium issue

    一般推荐的current workaround是使用DesiredCapabilities来设置窗口大小,但是你说得对,它在Mac上似乎根本不起作用。

    我找到的唯一解决方案是使用 JavaScript 打开一个新窗口并以相同的方式调整新窗口的大小。它在this thread on the topic 中有详细描述。相关变通方法如下代码所示:

    JavascriptExecutor js = ((JavascriptExecutor)driver);
    js.executeScript("window.open('','testwindow','width=400,height=200')");
    driver.close();
    driver.switchTo().window("testwindow");
    js.executeScript("window.moveTo(0,0);");
    js.executeScript("window.resizeTo(1280,800);");
    

    恐怕它很笨重,但它在 Mac (Lion) 上使用 chrome 在本地对我有用。

    【讨论】:

    • 谢谢!这对我有用,但我跳过了移动并调整大小。我刚刚用js.executeScript("window.open('','testwindow','width=1280,height=800,top=0,left=0')"); 初始化它(例如使用你的值)。
    • setSize() 现在似乎在 Mac 上运行良好,但是,当运行一组测试时,我发现在某个随机点,在运行了五个测试中的四个之后,大小变得非常奇怪(比如当我设置为 1200 时为 917 宽)。为避免这种情况,请在setSize() 调用之前调用driver.manage().window().setPosition(new Point(0, 0));。最近在这个旧的 Selenium 错误报告中提到了这一点:code.google.com/p/selenium/issues/detail?id=174#c55
    【解决方案2】:

    您在这里描述的情况对我来说也是如此。 在this article 之后,您可以在启动时设置 chromedriver 的首选项。

    鲁比:

    profile = Selenium::WebDriver::Chrome::Profile.new
    profile['browser.window_placement.top'] = 0
    profile['browser.window_placement.left'] = 0
    profile['browser.window_placement.right'] = 1024
    profile['browser.window_placement.bottom'] = 768
    Selenium::WebDriver.for :chrome, profile: profile
    

    这适用于 Windows 和 Mac。 但是在 Java 上,我无法验证用于设置 chromedriver 首选项的 API。 Here is a question 询问过,但似乎还没有找到答案。

    【讨论】:

      【解决方案3】:

      到目前为止我发现的最佳解决方案如下:

      启动浏览器后运行以下代码

      Point targetPosition = new Point(0, 0);
      driver.manage().window().setPosition(targetPosition);
      
      Dimension targetSize = new Dimension(1920, 1080); //your screen resolution here
      driver.manage().window().setSize(targetSize);
      

      我希望它有所帮助。我设法使用此解决方案在 MAC 下最大化 Chrome。

      【讨论】:

        【解决方案4】:

        driver.manage().window().setSize()是你要使用的方法

        【讨论】:

        • 我注意到这适用于 firefoxdriver 但不适用于 chrome 驱动程序。使用 chromedriver,我得到了帖子中显示的异常。
        【解决方案5】:

        我通过执行苹果脚本解决了这个问题。当然,这会将您与在 Mac 上执行相关联,但这对我们来说没问题。 Windows 对 Chrome 没有同样的最大化问题,所以如果你关心你可以做一个OS check

        我找到了我使用的苹果脚本here。我在下面复制了它以防链接中断:

        tell application (path to frontmost application as string) 
        to copy (run script "tell application \"Finder\" to desktop's window's bounds") 
        to bounds of window 1
        

        我使用这个脚本(灵感来自this question)首先激活了浏览器窗口:

        tell application "Google Chrome"
            activate
        end tell
        

        我使用这个命令在 Java 中执行:

        Runtime.getRuntime().exec(scriptPath)
        

        希望这对某人有所帮助。

        【讨论】:

          【解决方案6】:

          这是一个很老的帖子,但我今天仍然遇到这个问题并使用下面的代码解决了。

          java.awt.Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
          org.openqa.selenium.Point position = new Point(0, 0);
          driver.manage().window().setPosition(position);
          org.openqa.selenium.Dimension maximizedScreenSize =
                      new Dimension((int) screenSize.getWidth(), (int) screenSize.getHeight());
          driver.manage().window().setSize(maximizedScreenSize);
          

          【讨论】:

            【解决方案7】:

            我在 MAC 上遇到了同样的问题。

            我尝试了以下选项但不起作用:

            1. driver.manage().window().maximize();

            2. 这里

              ChromeOptions chromeOptions = new ChromeOptions();
              chromeOptions.addArguments("--start-maximized");
              driver = new ChromeDriver(chromeOptions);
              

            最后我找到了适用于所有操作系统的以下解决方案:

            ChromeOptions options = new ChromeOptions();
            options.addArguments("start-fullscreen");
            

            如有任何疑问,请告诉我。

            【讨论】:

              【解决方案8】:

              请检查以下解决方案, 它会为你工作。

              System.setProperty("webdriver.chrome.driver", driverPath);
              ChromeOptions options= new ChromeOptions();
              options.addArguments("start-fullscreen");
              

              【讨论】:

                【解决方案9】:

                我使用 webdrivermanagerselenide。最大化窗口 Configuration.startMaximized = true

                import io.github.bonigarcia.wdm.ChromeDriverManager;
                import com.codeborne.selenide.Configuration;
                import io.github.bonigarcia.wdm.DriverManagerType;
                
                import static com.codeborne.selenide.Selenide.open;
                
                public class Main {
                
                    public static void main(String[] args) {
                        ChromeDriverManager.getInstance(DriverManagerType.CHROME).version("76.0.3809.126").setup();
                        Configuration.baseUrl = "https://www.google.com/";
                        Configuration.startMaximized = true;
                        open("/");
                

                【讨论】: