Переключить вкладки с помощью Selenium WebDriver с Java
Используя Selenium WebDriver с JAVA,
Я пытаюсь автоматизировать функциональность, где мне нужно открыть новую вкладку, выполнить некоторые операции там и вернуться к предыдущей вкладке (Родитель).
Я использовал ручку переключения, но не работал.
И одна странная вещь, что две вкладки имеют один и тот же дескриптор окна, из-за которого я не могу переключаться между вкладками.
Однако, когда я пытаюсь использовать разные окна Firefox, он работает, но для вкладки он не работает.
Пожалуйста, помогите мне, как я могу переключаться на вкладки.
ИЛИ как я могу переключить вкладки, не используя дескриптор окна, поскольку дескриптор окна совпадает с обоими вкладками в моем случае.
(Я заметил, что когда вы открываете разные вкладки в том же окне, дескриптор окна остается таким же.)
Ответы
Ответ 1
psdbComponent.clickDocumentLink();
ArrayList<String> tabs2 = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs2.get(1));
driver.close();
driver.switchTo().window(tabs2.get(0));
Этот код отлично работал у меня. Попробуйте. Вам всегда нужно переключить драйвер на новую вкладку, прежде чем вы хотите что-то сделать на новой вкладке.
Ответ 2
Это простое решение для открытия новой вкладки, смены фокуса на ней, закрытия вкладки и возврата фокуса к старой/оригинальной вкладке:
@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());
}
Ответ 3
Существует разница в том, как веб-драйвер обрабатывает разные окна и как он обрабатывает разные вкладки.
Случай 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
Ответ 4
Работайте
Предположение: нажав что-то на своей веб-странице, вы откроете новую вкладку.
Используйте следующую логику для перехода на вторую вкладку.
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();
Ответ 5
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
Надеюсь, это поможет вам.
Ответ 6
Первое, что вам нужно сделать, это открыть новую вкладку и сохранить ее имя дескриптора. Лучше всего это сделать, используя 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();
}
Ответ 7
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB);
Этот метод помогает при переключении между несколькими окнами. Ограничивающая проблема с этим методом заключается в том, что его можно использовать только столько раз, пока не будет достигнуто требуемое окно. Надеюсь, что это поможет.
Ответ 8
С 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 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 CURRENT TAB
}
Надеюсь, это даст вам представление о том, как управлять несколькими вкладками в нескольких окнах браузера.
Ответ 9
У меня была проблема в последнее время, ссылка была открыта на новой вкладке, но селен все еще находился на начальной вкладке.
Я использую Chromedriver, и единственный способ сосредоточиться на вкладке - это использовать switch_to_window()
.
Здесь код Python:
driver.switch_to_window(driver.window_handles[-1])
Итак, наконечник должен узнать имя требуемого дескриптора окна, оно хранится как список в
driver.window_handles
Ответ 10
См. ниже:
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");
Надеюсь, что это будет полезно!
Ответ 11
Это очень простой процесс: предположим, что у вас есть две вкладки, поэтому вам нужно сначала закрыть текущую вкладку, используя client.window(callback)
, потому что команда switch "переключается на первую доступную". Затем вы можете легко переключаться на вкладку с помощью client.switchTab
.
Ответ 12
Краткий пример переключения между вкладками в браузере (в случае одного окна):
// 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 для перехода на предыдущую вкладку.
Ответ 13
Это будет работать для 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, "{");
Ответ 14
Чтобы получить дескрипторы родительского окна.
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;
}
Ответ 15
Простой ответ, который работал у меня:
for (String handle1 : driver1.getWindowHandles()) {
System.out.println(handle1);
driver1.switchTo().window(handle1);
}