【问题标题】:How to open multiple windows using Selenium WebDriver如何使用 Selenium WebDriver 打开多个窗口
【发布时间】:2015-09-25 16:14:32
【问题描述】:

我正在尝试使用 Selenium WebDriver 了解“在多个窗口之间切换”,但为此我无法使用 driver.get() 或 driver.navigate.to() 打开多个窗口,这会在 SAME 中打开链接窗户。有人可以帮助我使用相同的驱动程序实例打开多个窗口吗? 我提供了我的示例代码。 n 的值是 1 而不是 2 作为它在同一个窗口中的开口。 请帮忙。

public class MultipleWindows {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        WebDriver driver = new FirefoxDriver();

        driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);


        driver.get("http://www.google.com");

        driver.navigate().to("http://www.facebook.com");


        int n = driver.getWindowHandles().size();
        System.out.println(n);

    }

}

【问题讨论】:

    标签: java selenium


    【解决方案1】:

    这样也可以

    这将创建一个新的选项卡/窗口并打开给定的 url

    String url="whatever url or empty to open a empty tab";
    ((JavascriptExecutor) driver).executeScript("window.open(arguments[0])", url);
    

    【讨论】:

      【解决方案2】:

      WebDriver navigate().to()get() 做同样的事情。没有打开新窗口的API,但是可以使用ctrl+n热键:

          WebDriver driver = new FirefoxDriver();
          WebElement body = driver.findElement(By.tagName("body"));
          body.sendKeys(Keys.chord(Keys.CONTROL, "n"));
          System.out.println(driver.getWindowHandles().size());
          driver.quit();
      

      或者您可以使用几个 WebDriver 实例(请参阅Selenium Java open new window, close it, and control main window again

      【讨论】:

      • 还有一个疑问,有没有办法用特定的 url 打开那个新窗口,比如 facebook.com? TIA
      • 没有什么特别的,当你打开新窗口时,你可以简单地使用get() 来服务到一个特定的url。并使用switchTo().window(winHandle) 切换窗口。
      【解决方案3】:

      there 的另一种方式

              WebDriver driver = new ChromeDriver();
              driver.get(adminToolURL);
              Set<String> windows = driver.getWindowHandles();
              String adminToolHandle = driver.getWindowHandle();
              ((JavascriptExecutor) driver).executeScript("window.open();");
              Set<String> customerWindow = driver.getWindowHandles();
              customerWindow.removeAll(windows);
              String customerSiteHandle = ((String) customerWindow.toArray()[0]);
              driver.switchTo().window(customerSiteHandle);
              driver.get(customerSiteURL);
              driver.switchTo().window(adminToolHandle);
      

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        我使用了清晰的方式。我创建了 driverA 和 driverB,然后我可以打开 2 个窗口并在其上进行操作而不会出现任何错误:

        private WebDriver driverA;
        private WebDriver driverB;
        
        @BeforeClass(alwaysRun = true)
        private void executeBeforeClass() {
            driverB = BrowserFactory.startBrowser(browser, baseUrl);
            driverA = BrowserFactory.startBrowserAsIncognito(browser, baseUrl);
        }
        
        @AfterClass(alwaysRun = true)
        public void runAfterClass(){
            if(driverA!=null){
                driverA.quit();
            }
            if(driverB!=null){
                driverB.quit();
            }
        }
        
        
        
        @Test
        public void shouldEhcacheWorkFine() {
        
            new LoginPage(driverA).loginToTomcatA(login, password)
                    .goToListCompaniesPage()
                    .goToEditFirstCompanyPage()
                    .setPersonName(NAME);
        
            EditPage editPageB = new LoginPage(driverB).loginToTomcatB(login, password)
                    .goToListCompaniesPage()
                    .goToEditFirstCompanyPage();
            assertThat(editCompanyPageB.getPersonName(), is(NAME));
        }
        

        【讨论】:

          【解决方案5】:

          拨打driver.get("http://www.google.com");后,打开新窗口请按照以下方法。

          使用.sendKeys方法:

          String multipleKeys = Keys.chord(Keys.CONTROL, "t");
          driver.findElement(By.tagName("body")).sendKeys(multipleKeys);
          

          使用Actions

          Actions action = new Actions(driver);
          action.keyDown(Keys.CONTROL).sendKeys("t").keyUp(Keys.CONTROL).build().perform();
          

          *注意Mac OS请把Keys.CONTROL改成Keys.COMMAND

          使用JavascriptExecutor

          • 打开新的空白窗口:
          ((JavascriptExecutor) driver).executeScript("window.open()");
          
          • 使用特定网址打开新窗口:
          ((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");
          

          希望这会有所帮助。

          【讨论】:

            【解决方案6】:
            for (int i = 1; i < 10; i++) {
                        ((JavascriptExecutor) driver).executeScript("window.open('https://www.google.com/')");
                        ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
                        driver.switchTo().window(tabs.get(i));
                        Thread.sleep(2000);
                    }
            

            【讨论】: