【问题标题】:In a multi-monitor display environment, how do I tell Selenium which display to open a new window in?在多显示器显示环境中,如何告诉 Selenium 在哪个显示器中打开新窗口?
【发布时间】:2022-03-01 22:52:58
【问题描述】:

很抱歉,如果这已被问及并回答。我进行了搜索,但没有找到。

【问题讨论】:

  • 这个问题适用于 Windows 还是 Mac?

标签: selenium


【解决方案1】:

两个选项(这是用于 包装器):

  1. 使用 Selenium Driver 的窗口定位命令:

    var monitor = Screen.FromPoint(new Point(Screen.PrimaryScreen.Bounds.Right + 1, Screen.PrimaryScreen.Bounds.Top));
    
    var seleniumDriver = new ChromeDriver(options);
    seleniumDriver.Manage().Window.Position = new Point(monitor.Bounds.X, monitor.Bounds.Y);
    
    var coypuDriver = new MultimonWebDriver(seleniumDriver, Browser.Chrome);
    var rv = new BrowserSession(sessionConfiguration, coypuDriver);
    
  2. 使用命令行参数配置驱动程序。我更喜欢这个,因为解决方案 #1 在处理移动命令之前会导致驱动程序服务器闪烁显示窗口:

    var monitor = Screen.FromPoint(new Point(Screen.PrimaryScreen.Bounds.Right + 1, Screen.PrimaryScreen.Bounds.Top));
    
    var options = new ChromeOptions();
    options.AddArgument(String.Format("--window-position={0},{1}", monitor.Bounds.X, monitor.Bounds.Y));
    
    var seleniumDriver = new ChromeDriver(options);
    var coypuDriver = new MultimonWebDriver(seleniumDriver, Browser.Chrome);
    var rv = new BrowserSession(sessionConfiguration, coypuDriver);
    

MultimonWebDriver 只是公开对受保护构造函数的访问:

public class MultimonWebDriver : SeleniumWebDriver
{
  public MultimonWebDriver(IWebDriver webDriver, Browser browser) : base(webDriver, browser)
  {
  }
}

【讨论】:

    【解决方案2】:

    在python中:

    browser = webdriver.Chrome()
    browser.set_window_position(2000, 0)
    

    【讨论】:

    • 这在 C# 中也很有效。我使用:options.AddArguments("window-position=-2000,0");然后 driver.Manage().Window.Maximize();将 Chrome 放在我的左侧显示器上。
    【解决方案3】:

    实际上有一个相当简单的方法可以做到这一点。有一种名为“set_window_position”的方法,它接受负值。所以我希望浏览器在我的左侧屏幕上打开,所以一个简单的负 1000px 像素将其拖入足以让最大化窗口选择左侧屏幕。

    driver.set_window_position(-1000, 0)
    driver.maximize_window()
    

    因此,根据屏幕尺寸和您想要的位置,进行一些计算并将其拖到那里!

    来源:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.firefox.webdriver(本示例选择 Firefox)

    【讨论】:

      【解决方案4】:

      在 OSX Mavericks 中,您可以在单击并按住 Dock 中的图标时从“选项”菜单中分配桌面。这解决了我的问题。

      【讨论】:

      • 你是救命稻草。
      • 换句话说,有dock的监视器是默认监视器,也是Selenium浏览器默认打开的地方。
      【解决方案5】:

      我使用这个不是很花哨但快速的方法来实现它。因为我不仅希望它出现在我的第二个屏幕上,而且还希望它最大化,所以我不必在坐标上过于精确。任何高于 2000 的 X 坐标通常位于我所有开发机器的第二个屏幕上:(此示例使用 chromedriver,但适用于任何 IWebDriver)

      chrome = new ChromeDriver();
      chrome.Manage().Window.Position = new System.Drawing.Point(2000, 1); // To 2nd monitor. 
      chrome.Manage().Window.Maximize();
      

      【讨论】:

        【解决方案6】:

        Wailord 的回答对我有用,但它总是打开窗口然后移动它。所以有一个短暂的时刻,它会阻止我的编辑器。

        Chrome 有一个窗口位置的命令行开关
        --window-position=x,y
        https://peter.sh/experiments/chromium-command-line-switches/#window-position

        from selenium import webdriver
        options = webdriver.ChromeOptions()
        options.add_argument('window-position=2000,0')  # opens at x=2000,y=0 from the start
        driver = webdriver.Chrome(options=options)
        

        【讨论】:

        • 这可能应该是公认的答案,因为 OP 似乎正试图在创建新窗口时执行此操作,而其他答案正在将在错误监视器上开始的窗口移动到不同的监视器。
        【解决方案7】:

        我有 2 台 1920x1080 显示器,我将浏览器窗口移动到第二台显示器并在那里最大化。

        1. 获取屏幕分辨率

          java.awt.Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
          double width = screenSize.getWidth();
          double height = screenSize.getHeight();
          
        2. 将浏览器移动到第二个显示器并最大化

          if (width <= 1920) {
              Point point = new Point(width, 0);
              driver.manage().window().setPosition(point);
              driver.manage().window().maximize();
          }
          
        3. 如果您的分辨率比典型显示器宽,请以更真实的分辨率打开浏览器(这是可选的,但我建议这样做)

          else 
          
          {
              Point point = new Point(0, 0);
              driver.manage().window().setPosition(point);
          
              Dimension targetWindowSize = new Dimension(1920, 1080);
              driver.manage().window().setSize(targetWindowSize);
          }
          

        【讨论】:

          【解决方案8】:

          在辅助监视器上运行测试对于调试非常有用。不幸的是,您无法指定应在哪个监视器上打开浏览器。选项有:

          1. 打开浏览器并将其拖动到所需的监视器,然后将其关闭。下次将在该显示器上打开它
          2. 使用Ultramon 之类的软件来控制在哪个显示器上启动浏览器。

          您还可以使用将在第二台显示器上运行的虚拟机 - 只需将其拖到那里即可。

          【讨论】:

          • 我的 SUT(被测系统)在我的测试场景中的某些点打开一个新窗口。我有三台显示器,我想将它发送到另一台显示器。那好吧。我最终决定强制打开应用程序的监视器的技术是使用我的 Macbook 的 System Preferences -> display 来设置哪个窗口是主窗口。它默认为我的笔记本电脑(太小),每次弹出窗口时都会弹出那里。通过将我的一个大型显示器作为主窗口,现在所有内容都会出现在那里。谢谢你的回答。
          • 这个答案可能不会一直有效。尤其是当您更换显示器时(在家工作、系统重启等)。下面的答案比公认的答案更好。 PS:我已经在下面发布了我的解决方案
          【解决方案9】:

          使用这个条件:

          WebDriver chrome1 = new ChromeDriver();
          WebDriver chrome2 = new ChromeDriver();
          
          chrome1.manage().window().maximize();//display 1
          
          chrome2.manage().window().setPosition(new Point(2000,0));//display 2
          Thread.sleep(1000);// 1 sec
          chrome2.manage().window().maximize();//maximize display 2
          

          【讨论】:

            【解决方案10】:

            如果您运行的是 Windows 7 或更高版本,您可以通过在“更改显示设置”下将所需的显示器设置为主显示器来实现此目的。现在,任何新的浏览器窗口都将在此打开。请记住,这当然会影响您的工具栏等,这可能会或可能不会令人讨厌。这肯定比让浏览器窗口稳定地丢在脸上更烦人。

            【讨论】:

              【解决方案11】:

              在 Mac 上,您可以在 System Preferences &gt; Displays &gt; Arrangement 中控制它

              主屏幕顶部有一个白条。将其拖到您希望呈现浏览器的屏幕上

              【讨论】:

                【解决方案12】:

                我的解决方案是安装 VNC 服务器,在其中一台显示器中打开 VNC,然后通过 VNC 启动 selenium。 然后你总是有一个 selenium 浏览器的监视器,而不会在每次启动测试时打开烦人的窗口

                【讨论】:

                  【解决方案13】:

                  对于Java

                  //imports:
                  import java.awt.*;
                  import java.awt.event.InputEvent;
                  
                  driver = new FirefoxDriver();
                  
                  //drag & drop to my right screen in debug mode:
                  boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().getInputArguments().toString().indexOf("jdwp") >= 0;
                  
                  if(isDebug) {
                    Robot robot = new Robot();
                  
                    robot.mouseMove(800, 10);
                    robot.mousePress(InputEvent.BUTTON1_MASK);
                    robot.mouseMove(2800, 100);
                    robot.mouseRelease(InputEvent.BUTTON1_MASK);
                    driver.manage().window().maximize();
                  }
                  

                  driver.manage().window().setPosition(point); 对我不起作用。

                  【讨论】:

                    【解决方案14】:

                    我注意到通过在下面设置这些内容,我的浏览器总是在同一个显示器中打开(我有两个显示器,一个 eDP 和一个辅助 HDMI 显示器)。可能跟职位有关:

                    # console log
                    d = desired_capabilities.DesiredCapabilities.CHROME
                    d['loggingPrefs'] = { 'browser':'ALL' }
                    
                    # Driver
                    self.driver = webdriver.Chrome(desired_capabilities=d)
                    self.driver.implicitly_wait(5) # seconds
                    self.driver.set_window_size(800, 800)
                    self.driver.set_window_position(0, 0)
                    

                    【讨论】:

                      【解决方案15】:

                      我注意到对我来说它总是在主监视器中打开。所以我从 OSX 显示排列选项窗口更改了主显示。

                      【讨论】:

                        【解决方案16】:

                        如果您要打开浏览器窗口的监视器位于带有 IDE 的监视器的 左侧,请尝试负值。在 Java 中:

                        WebDriver driver = new FirefoxDriver();
                        driver.manage().window().setPosition(new Point(-1500, 0));
                        

                        【讨论】:

                          【解决方案17】:

                          只需将 Mac“菜单栏”放在您希望打开浏览器的显示器上。这将设置默认监视器。

                          【讨论】:

                            【解决方案18】:

                            我找到了一种解决方法,在我的情况下,它在 Windows 10 中对我有用。我只是通过显示设置将我的第二台显示器作为主显示器:

                            Main Display via Display Settings

                            希望这对您也有帮助!

                            【讨论】:

                            • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
                            【解决方案19】:

                            我在 Java 中使用它,它正在工作

                            public void maximizeToNextMonitor(WebDriver driver, String server) {
                                driver.get(server);
                                Window window = driver.manage().window();
                                window.maximize();
                                window.setPosition(new org.openqa.selenium.Point(window.getSize().getWidth(), 0));
                                window.maximize();
                            }
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 2018-10-24
                              • 1970-01-01
                              • 2013-04-28
                              • 2022-08-22
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多