Вопрос-ответ

Switch tabs using Selenium WebDriver with Java

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

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

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

Как я могу переключать вкладки? Или, как я могу переключать вкладки без использования дескриптора окна, поскольку дескриптор окна одинаков для обеих вкладок в моем случае?

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

Переведено автоматически
Ответ 1
    psdbComponent.clickDocumentLink();
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
driver.close();
driver.switchTo().window(tabs.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

Существует разница в том, как Web driver обрабатывает разные окна и как он обрабатывает разные вкладки.


Пример 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();
java selenium selenium-webdriver