【问题标题】:How to move selenium's focus to the new tab window?如何将 selenium 的焦点移动到新标签窗口?
【发布时间】:2019-01-10 21:42:56
【问题描述】:

我正在单击一个链接,这会导致新标签页。我想移动到该选项卡,关闭该选项卡,然后再次切换回父窗口。

我写了以下代码,它显示错误,实际上在我的代码中,控件没有移动到子窗口。请参阅以下代码,并帮助我:

WebDriver driver;
System.setProperty("Webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();
driver.get("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open");
String parent_window = driver.getWindowHandle();
driver.switchTo().frame("iframeResult");
driver.findElement(By.xpath("//button[contains(text(),'Try it')]")).click();
Thread.sleep(4000);
String child_window = driver.getWindowHandle();
System.out.println(parent_window);
System.out.println(child_window);

【问题讨论】:

  • 它工作正常?有什么问题

标签: java selenium selenium-webdriver window-handles webdriverwait


【解决方案1】:

你也可以用这种代码来做,标签之间的切换。

public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "Location of chromedriver exe file");

System.out.println("Ready to launch the browser");
WebDriver driver = new ChromeDriver();
driver.get("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open");
driver.switchTo().frame("iframeResult");
driver.findElement(By.xpath("//button[contains(text(),'Try it')]")).click();
Thread.sleep(4000);

  //store parent window value in string
  String parentWindow = driver.getWindowHandle();

  //store the set of all windows
  Set<String> allwindows= driver.getWindowHandles();

  for (String childWindow : allwindows) {
    if(!childWindow.equals(parentWindow))
      {
        driver.switchTo().window(childWindow);
        System.out.println("child window");
        System.out.println(driver.getTitle());      
        // do some operation
        //Closing the Child Window.
         driver.close();    
     }
    }
    driver.switchTo().window(parentWindow);
    System.out.println("Parent window");
    System.out.println(driver.getTitle());      
}

【讨论】:

    【解决方案2】:

    控件没有移动到子窗口,因为您没有捕获子窗口的句柄并切换到它。打开新标签后,您需要使用 getWindowHandles() 方法查找所有窗口句柄。 getWindowHandles() 方法返回的集合中的第一个值将是父窗口的句柄,第二个值将是子窗口的句柄。如果要对子窗口进行任何操作,首先需要使用driver.switchTo().window()切换到子窗口。下面的代码演示了我们如何切换到新标签然后关闭它:

    WebDriver driver;
    System.setProperty("Webdriver.chrome.driver", "chromedriver.exe");
    driver = new ChromeDriver();
    driver.get("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open");
    
    driver.switchTo().frame("iframeResult");
    driver.findElement(By.xpath("//button[contains(text(),'Try it')]")).click();
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    Set<String> handles = driver.getWindowHandles();
    
    if (handles.size() == 2) {
        Iterator<String> itr = handles.iterator(); 
    
        String parent_window = itr.next().toString();
        String child_window = itr.next().toString();
        System.out.println(parent_window);
        System.out.println(child_window);
    
        // switching to child window
        driver.switchTo().window(child_window);
    
        // closing child window
        driver.close();
    
        // switching back to parent window
        driver.switchTo().window(parent_window);
    
    } else {
        System.out.println("New tab did not open.");
    }
    

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

    【讨论】:

      【解决方案3】:

      您需要注意以下几点:

      • System.setProperty() 行内,Keywebdriver.chrome.driver
      • System.setProperty() 行内,Value 必须是 WebDriver 变体的绝对路径,即chromedriver.exe
      • 要将switch() 设置为新标签,您需要诱导WebDriverWait 并将ExpectedConditions 设置为numberOfWindowsToBe()
      • 这是您自己的代码,经过一些简单的修改:

        WebDriver driver;
        System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.get("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open");
        String parent_window = driver.getWindowHandle();
        driver.switchTo().frame("iframeResult");
        driver.findElement(By.xpath("//button[contains(text(),'Try it')]")).click();
        new WebDriverWait(driver,10).until(ExpectedConditions.numberOfWindowsToBe(2));
        Set<String> windows = driver.getWindowHandles();
        for(String child_window:windows)
            if(!parent_window.equals(child_window))
            {
                driver.switchTo().window(child_window);
                System.out.println(child_window);
            }
        

      【讨论】:

        猜你喜欢
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多