it-swarm.com.ru

Переключать вкладки с помощью Selenium WebDriver с Java

Использование Selenium WebDriver с Java . Я пытаюсь автоматизировать функциональность, в которой я должен открыть новую вкладку, выполнить некоторые операции и вернуться на предыдущую вкладку (Родитель) . Я использовал дескриптор переключателя, но он не работает. И одна странная вещь: две вкладки имеют одинаковый дескриптор окна, из-за чего я не могу переключаться между вкладками.

Однако, когда я пытаюсь с различными окнами Firefox, это работает, но для вкладки это не работает.

Пожалуйста, помогите мне, как я могу переключать вкладки . ИЛИ как я могу переключать вкладки, не используя дескриптор окна, так как дескриптор окна одинаков для обеих вкладок в моем случае.

(Я заметил, что когда вы открываете разные вкладки в одном и том же окне, дескриптор окна остается тем же)

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

Этот код прекрасно работал для меня. Попробуйте это. Вам всегда нужно переключить драйвер на новую вкладку, прежде чем что-то делать на новой вкладке.

79
Sireesha Middela

Это простое решение для открытия новой вкладки, изменения фокуса на нее, закрытия вкладки и возврата фокуса к старой/исходной вкладке:

@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());
}
19
Jordan Silva

Есть разница, как веб-драйвер обрабатывает разные окна и как он работает с разными вкладками.

Случай 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);


Дело 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

11
Sourabh

Работа вокруг

Предположение: при нажатии чего-либо на веб-странице открывается новая вкладка.

Используйте приведенную ниже логику, чтобы перейти ко второй вкладке.

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();
7
Santoshsarma
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

Надеюсь, это поможет вам ..

3
Vishwak

Первое, что вам нужно сделать, это открыть новую вкладку и сохранить ее имя. Лучше всего делать это с помощью 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();
    }
2
Ed Ram
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB);

Этот метод помогает в переключении между несколькими окнами. Проблема этого метода заключается в том, что его можно использовать столько раз, пока не будет достигнуто требуемое окно. Надеюсь, поможет.

1
Anand Ramamurthy

В Selenium 2.53.1 с использованием Firefox 47.0.1 в качестве WebDriver в Java: независимо от того, сколько вкладок я открыл, «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
}

Надеюсь, это даст вам хорошее представление о том, как управлять несколькими вкладками в нескольких окнах браузера.

1
Charles Woodson

Поскольку 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.
1
Natesh bhat

открытый класс 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);
}
0
Aravind HB

Пожалуйста, смотрите ниже:

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");

Надеюсь, что это полезно!

0
Prashant

Недостатком выбранного ответа является то, что он излишне принимает порядок в 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
The Gilbert Arenas Dagger

Это будет работать для MacOS для 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, "{");
0
ramy

У меня недавно была проблема, ссылка была открыта в новой вкладке, но Selenium все еще фокусировалась на начальной вкладке.

Я использую Chromedriver, и единственный способ сосредоточиться на вкладке - использовать switch_to_window().

Вот код Python:

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

Таким образом, совет состоит в том, чтобы узнать имя дескриптора окна, которое вам нужно, они хранятся в виде списка в

driver.window_handles
0
Kee

Получить родительские дескрипторы окон. 

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
Ankit Gupta

Это очень простой процесс: предположим, у вас есть две вкладки, поэтому вам нужно сначала закрыть текущую вкладку с помощью client.window(callback), потому что команда switch «переключается на первую доступную». Затем вы можете легко переключаться между вкладками, используя client.switchTab.

0
Ravi Ubana

Краткий пример того, как переключаться между вкладками в браузере (в случае с одним окном):

// 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
Stas
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 вкладки, на которую вы хотите переключиться

0
Rahul Rana

Простой ответ, который работал для меня:

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