首页 文章

使用Selenium WebDriver和Java切换选项卡

提问于
浏览
47

使用Selenium WebDriver与JAVA,我试图自动化一个功能,我必须打开一个新的选项卡在那里做一些操作,并回到上一个选项卡(父) . 我使用了开关手柄,但它不起作用 . 还有一个奇怪的事情是两个标签有相同的窗口句柄,因此我无法在标签之间切换 .

但是,当我尝试使用不同的Firefox窗口时,它可以工作,但是对于标签它不起作用 .

请帮我,我如何切换标签 . 或者如何在不使用窗口句柄的情况下切换标签,因为在我的情况下,窗口句柄与两个标签相同 .

(我观察到当你在同一个窗口中打开不同的标签时,窗口句柄保持不变 . )

19 回答

  • 6
    psdbComponent.clickDocumentLink();
        ArrayList<String> tabs2 = new ArrayList<String> (driver.getWindowHandles());
        driver.switchTo().window(tabs2.get(1));
        driver.close();
        driver.switchTo().window(tabs2.get(0));
    

    这段代码对我很有用 . 试试看 . 在要在新选项卡上执行某些操作之前,始终需要将驱动程序切换到新选项卡 .

  • 1

    这是打开新选项卡,将焦点更改为选项卡,关闭选项卡并将焦点返回到旧/原始选项卡的简单解决方案:

    @Test
    public void testTabs() {
        driver.get("https://business.twitter.com/start-advertising");
        assertStartAdvertising();
    
        // considering that there is only one tab opened in that point.
        String oldTab = driver.getWindowHandle();
        driver.findElement(By.linkText("Twitter Advertising Blog")).click();
        ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
        newTab.remove(oldTab);
        // change focus to new tab
        driver.switchTo().window(newTab.get(0));
        assertAdvertisingBlog();
    
        // Do what you want here, you are in the new tab
    
        driver.close();
        // change focus back to old tab
        driver.switchTo().window(oldTab);
        assertStartAdvertising();
    
        // Do what you want here, you are in the old tab
    }
    
    private void assertStartAdvertising() {
        assertEquals("Start Advertising | Twitter for Business", driver.getTitle());
    }
    
    private void assertAdvertisingBlog() {
        assertEquals("Twitter Advertising", driver.getTitle());
    }
    
  • 0

    Web驱动程序如何处理不同的窗口以及它如何处理不同的选项卡是有区别的 .

    Case 1:
    如果有多个窗口,则以下代码可以提供帮助:

    //Get the current window handle
    String windowHandle = driver.getWindowHandle();
    
    //Get the list of window handles
    ArrayList tabs = new ArrayList (driver.getWindowHandles());
    System.out.println(tabs.size());
    //Use the list of window handles to switch between windows
    driver.switchTo().window(tabs.get(0));
    
    //Switch back to original window
    driver.switchTo().window(mainWindowHandle);
    

    Case 2:
    如果同一窗口中有多个选项卡,则只有一个窗口句柄 . 因此,在窗口句柄之间切换可将控件保持在同一选项卡中 .
    在这种情况下,使用Ctrl \ t(Ctrl Tab)在标签之间切换更有用 .

    //Open a new tab using Ctrl + t
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
    //Switch between tabs using Ctrl + \t
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
    

    详细的示例代码可以在这里找到:
    http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

  • 0

    Work around

    假设:通过点击您网页上的内容,可以打开一个新标签 .

    使用以下逻辑切换到第二个选项卡 .

    new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD2).build().perform();
    

    以同样的方式,您可以再次切换回第一个标签 .

    new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD1).build().perform();
    
  • 0
    String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
        WebElement e = driver.findElement(By
                .xpath("html/body/header/div/div[1]/nav/a"));
    e.sendKeys(selectLinkOpeninNewTab);//to open the link in a current page in to the browsers new tab
    
        e.sendKeys(Keys.CONTROL + "\t");//to move focus to next tab in same browser
        try {
            Thread.sleep(8000);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        //to wait some time in that tab
        e.sendKeys(Keys.CONTROL + "\t");//to switch the focus to old tab again
    

    希望它对你有所帮助..

  • 76

    您需要做的第一件事是打开一个新选项卡并保存它的句柄名称 . 最好使用javascript而不是键(ctrl t),因为密钥在自动化服务器上并不总是可用 . 例:

    public static String openNewTab(String url) {
        executeJavaScript("window.parent = window.open('parent');");
        ArrayList<String> tabs = new ArrayList<String>(bot.driver.getWindowHandles());
        String handleName = tabs.get(1);
        bot.driver.switchTo().window(handleName);
        System.setProperty("current.window.handle", handleName);
        bot.driver.get(url);
        return handleName;
    }
    

    您需要做的第二件事是在标签之间切换 . 仅通过切换窗口句柄执行此操作并不总是有效,因为您将使用的选项卡不会始终处于焦点,Selenium将不时失败 . 正如我所说,使用密钥有点问题,而javascript并不真正支持切换标签,所以我使用警报切换标签,它就像一个魅力:

    public static void switchTab(int tabNumber, String handleName) {
            driver.switchTo().window(handleName);
            System.setProperty("current.window.handle", handleName);
            if (tabNumber==1)
                executeJavaScript("alert(\"alert\");");
            else
                executeJavaScript("parent.alert(\"alert\");");
            bot.wait(1000);
            driver.switchTo().alert().accept();
        }
    
  • 0
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB);
    

    此方法有助于在多个窗口之间切换 . 这种方法的限制问题是它只能被使用很多次,直到达到所需的窗口 . 希望能帮助到你 .

  • 0
    protected void switchTabsUsingPartOfUrl(String platform) {
        String currentHandle = null;
        try {
            final Set<String> handles = driver.getWindowHandles();
            if (handles.size() > 1) {
                currentHandle = driver.getWindowHandle();
            }
            if (currentHandle != null) {
                for (final String handle : handles) {
                    driver.switchTo().window(handle);
                    if (currentUrl().contains(platform) && !currentHandle.equals(handle)) {
                        break;
                    }
                }
            } else {
                for (final String handle : handles) {
                    driver.switchTo().window(handle);
                    if (currentUrl().contains(platform)) {
                        break;
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("Switching tabs failed");
        }
    }
    

    调用此方法并将参数传递给要切换到的选项卡的url的子字符串

  • 3

    使用Selenium 2.53.1使用firefox 47.0.1作为Java中的WebDriver:无论我打开多少个选项卡,“driver.getWindowHandles()”只返回一个句柄,因此无法在选项卡之间切换 .

    一旦我开始使用Chrome 51.0,我就可以获得所有句柄 . 以下代码显示如何访问每个驱动程序中的多个驱动程序和多个选项卡 .

    // INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
    driver1 = new ChromeDriver();
    driver2 = new ChromeDriver();
    
    // LOOP TO OPEN AS MANY TABS AS YOU WISH
    for(int i = 0; i < TAB_NUMBER; i++) {
       driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
       // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
       Thread.sleep(100);
    
    // STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
    ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());
    
    // REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)
    
    // LOOP TO OPEN AS MANY TABS AS YOU WISH
    for(int i = 0; i < TAB_NUMBER; i++) {
       driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
       // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
       Thread.sleep(100);
    
    // STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
    ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());
    
    // NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
    for(int ii = 0; ii <= TAB_NUMBER; ii++) {
       driver1.switchTo().window(tabs1.get(ii));
       // LOGIC FOR THAT DRIVER'S CURRENT TAB
    }
    
    // PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
    for(int ii = 0; ii <= TAB_NUMBER; ii++) {
       drvier2.switchTo().window(tabs2.get(ii));
       // LOGIC FOR THAT DRIVER'S CURRENT TAB
    }
    

    希望这能让您很好地了解如何在多个浏览器窗口中操作多个选项卡 .

  • 10

    由于 driver.window_handles 不合适,因此更好的解决方案就是这样 .

    首先使用快捷键Control X切换到第一个选项卡,切换到浏览器窗口中的第'x个选项卡 .

    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "1");
    # goes to 1st tab
    
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "4");
    # goes to 4th tab if its exists or goes to last tab.
    
  • 0

    我最近遇到了一个问题,链接是在一个新选项卡中打开的,但selenium仍然集中在初始选项卡上 .

    我正在使用Chromedriver,关注选项卡的唯一方法是让我使用 switch_to_window() .

    这是Python代码:

    driver.switch_to_window(driver.window_handles[-1])
    

    所以提示是找出你需要的窗口句柄的名称,它们存储为列表

    driver.window_handles
    
  • 18

    请看下面:

    WebDriver driver = new FirefoxDriver();
    
    driver.manage().window().maximize();
    driver.get("https://www.irctc.co.in/");
    String oldTab = driver.getWindowHandle();
    
    //For opening window in New Tab
    String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
    driver.findElement(By.linkText("Hotels & Lounge")).sendKeys(selectLinkOpeninNewTab);
    
    // Perform Ctrl + Tab to focus on new Tab window
    new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, Keys.TAB)).perform();
    
    // Switch driver control to focused tab window
    driver.switchTo().window(oldTab);
    
    driver.findElement(By.id("textfield")).sendKeys("bangalore");
    

    希望这有用!

  • 1

    这是一个非常简单的过程:假设您有两个选项卡,因此您需要先使用 client.window(callback) 关闭当前选项卡,因为切换命令"switches to the first available one" . 然后,您可以使用 client.switchTab 轻松切换选项卡 .

  • 1

    如何在浏览器中切换选项卡的简短示例(如果是一个窗口):

    // open the first tab
    driver.get("https://www.google.com");
    Thread.sleep(2000);
    
    // open the second tab
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
    driver.get("https://www.google.com");
    Thread.sleep(2000);
    
    // switch to the previous tab
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "" + Keys.SHIFT + "" + Keys.TAB);
    Thread.sleep(2000);
    

    我写 Thread.sleep(2000) 只是为了看到在标签之间切换的超时 .

    您可以使用CTRL TAB切换到下一个选项卡,使用CTRL SHIFT TAB切换到上一个选项卡 .

  • 0

    这适用于MacOS for Firefox和Chrome:

    // opens the default browser tab with the first webpage
    driver.get("the url 1");
    thread.sleep(2000);
    
    // opens the second tab
    driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND + "t");
    driver.get("the url 2");
    Thread.sleep(2000);
    
    // comes back to the first tab
    driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND, Keys.SHIFT, "{");
    
  • 2

    获取父窗口句柄 .

    String parentHandle = driverObj.getWindowHandle();
    public String switchTab(String parentHandle){
        String currentHandle ="";
        Set<String> win  = ts.getDriver().getWindowHandles();   
    
        Iterator<String> it =  win.iterator();
        if(win.size() > 1){
            while(it.hasNext()){
                String handle = it.next();
                if (!handle.equalsIgnoreCase(parentHandle)){
                    ts.getDriver().switchTo().window(handle);
                    currentHandle = handle;
                }
            }
        }
        else{
            System.out.println("Unable to switch");
        }
        return currentHandle;
    }
    
  • 0

    简单的答案对我有用:

    for (String handle1 : driver1.getWindowHandles()) {
            System.out.println(handle1); 
            driver1.switchTo().window(handle1);     
    }
    
  • 0

    选定答案的缺陷是它在 webDriver.getWindowHandles() 中不必要地假定顺序 . getWindowHandles() 方法返回 Set ,但不保证顺序 .

    我使用以下代码更改选项卡,不承担任何排序 .

    String currentTabHandle = driver.getWindowHandle();
    String newTabHandle = driver.getWindowHandles()
           .stream()
           .filter(handle -> !handle.equals(currentTabHandle ))
           .findFirst()
           .get();
    driver.switchTo().window(newTabHandle);
    
  • 0

    公共类TabBrowserDemo {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Main Started");
        System.setProperty("webdriver.gecko.driver", "driver//geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.irctc.co.in/eticketing/userSignUp.jsf");
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    
        driver.findElement(By.xpath("//a[text()='Flights']")).click();
        waitForLoad(driver);
        Set<String> ids = driver.getWindowHandles();
        Iterator<String> iterator = ids.iterator();
        String parentID = iterator.next();
        System.out.println("Parent WIn id " + parentID);
        String childID = iterator.next();
        System.out.println("child win id " + childID);
    
        driver.switchTo().window(childID);
        List<WebElement> hyperlinks = driver.findElements(By.xpath("//a"));
    
        System.out.println("Total links in tabbed browser " + hyperlinks.size());
    
        Thread.sleep(3000);
    //  driver.close();
        driver.switchTo().window(parentID);
        List<WebElement> hyperlinksOfParent = driver.findElements(By.xpath("//a"));
    
        System.out.println("Total links " + hyperlinksOfParent.size());
    
    }
    
    public static void waitForLoad(WebDriver driver) {
        ExpectedCondition<Boolean> pageLoadCondition = new
                ExpectedCondition<Boolean>() {
                    public Boolean apply(WebDriver driver) {
                        return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
                    }
                };
        WebDriverWait wait = new WebDriverWait(driver, 30);
        wait.until(pageLoadCondition);
    }
    

相关问题