Как обрабатывать новое окно в Selenium WebDriver с помощью Java?
Это мой код:
driver.findElement(By.id("ImageButton5")).click(); //Thread.sleep(3000); String winHandleBefore = driver.getWindowHandle(); driver.switchTo().window(winHandleBefore); driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219");
Теперь у меня есть следующая ошибка:
Исключение в streamе «main» org.openqa.selenium.NoSuchElementException: невозможно найти элемент с id == txtEnterCptCode (ПРЕДУПРЕЖДЕНИЕ: сервер не предоставил никакой информации о стеке) Длительность или тайм-аут команды: 404 миллисекунды.
- Выберите опцию из меню правой кнопки мыши в Selenium Webdriver - Java
- Элемент MyElement не кликается в точке (x, y) ... Другой элемент получит клик
- Как захватить снимок экрана определенного элемента, а не всей страницы, используя Selenium Webdriver?
- WebDriver - дождитесь использования элемента с помощью Java
- Как я могу попросить Selenium-WebDriver ждать несколько секунд в Java?
Есть идеи?
- Невозможно найти двоичный файл firefox в PATH. Убедитесь, что firefox установлен
- Как использовать selenium webdriver на локальной (на моем компьютере) веб-странице вместо того, чтобы найти где-нибудь на www?
- Сделайте снимок экрана с помощью Selenium WebDriver
- Загрузка файлов с использованием Selenium WebDriver и Java Robot Class
- WebDriver: проверьте, существует ли элемент?
- Есть ли проверенное решение mouseOver для FirefoxDriver в Selenium2?
- У нас есть какие-либо общие функции, чтобы проверить, полностью ли загружена страница в Selenium
- Замените неявное ожидание с явным ожиданием (selenium webdriver & java)
Похоже, вы фактически не переключаетесь ни в какое новое окно. Предполагается, что вы получите дескриптор windows вашего исходного windows, сохраните его, затем получите дескриптор windows нового windows и переключитесь на него. Как только вы закончите с новым окном, вам нужно закрыть его, а затем вернуться к исходному дескриптору windows. См. Мой пример:
т.е.
String parentHandle = driver.getWindowHandle(); // get the current window handle driver.findElement(By.xpath("//*[@id='someXpath']")).click(); // click some link that opens a new window for (String winHandle : driver.getWindowHandles()) { driver.switchTo().window(winHandle); // switch focus of WebDriver to the next found window handle (that's your newly opened window) } //code to do something on new window driver.close(); // close newly opened window when done with it driver.switchTo().window(parentHandle); // switch back to the original window
У меня есть метод утилиты для переключения на требуемое окно, как показано ниже.
public class Utility { public static WebDriver getHandleToWindow(String title){ //parentWindowHandle = WebDriverInitialize.getDriver().getWindowHandle(); // save the current window handle. WebDriver popup = null; Set windowIterator = WebDriverInitialize.getDriver().getWindowHandles(); System.err.println("No of windows : " + windowIterator.size()); for (String s : windowIterator) { String windowHandle = s; popup = WebDriverInitialize.getDriver().switchTo().window(windowHandle); System.out.println("Window Title : " + popup.getTitle()); System.out.println("Window Url : " + popup.getCurrentUrl()); if (popup.getTitle().equals(title) ){ System.out.println("Selected Window Title : " + popup.getTitle()); return popup; } } System.out.println("Window Title :" + popup.getTitle()); System.out.println(); return popup; } }
Это приведет к желаемому окну, когда заголовок windows будет передан как параметр. В вашем случае вы можете это сделать.
Webdriver childDriver = Utility.getHandleToWindow("titleOfChildWindow");
а затем снова переключитесь в родительское окно, используя тот же метод
Webdriver parentDriver = Utility.getHandleToWindow("titleOfParentWindow");
Этот метод работает эффективно при работе с несколькими windowsми.
У меня есть пример программы для этого:
открытый class BrowserBackForward {
/** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { WebDriver driver = new FirefoxDriver(); driver.get("http://seleniumhq.org/"); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //maximize the window driver.manage().window().maximize(); driver.findElement(By.linkText("Documentation")).click(); System.out.println(driver.getCurrentUrl()); driver.navigate().back(); System.out.println(driver.getCurrentUrl()); Thread.sleep(30000); driver.navigate().forward(); System.out.println("Forward"); Thread.sleep(30000); driver.navigate().refresh(); }
}
string BaseWindow = driver.CurrentWindowHandle; ReadOnlyCollection handles = driver.WindowHandles; foreach (string handle in handles) { if (handle != BaseWindow) { string title = driver.SwitchTo().Window(handle).Title; Thread.Sleep(3000); driver.SwitchTo().Window(handle).Title.Equals(title); Thread.Sleep(3000); } }
У меня возникли проблемы с дескриптором windows и попробовал это. этот работает для меня хорошо.
String parentWindowHandler = driver.getWindowHandle(); String subWindowHandler = null; Set handles = driver.getWindowHandles(); Iterator iterator = handles.iterator(); while (iterator.hasNext()){ subWindowHandler = iterator.next(); driver.switchTo().window(subWindowHandler); System.out.println(subWindowHandler); } driver.switchTo().window(parentWindowHandler);
Set windows = driver.getWindowHandles(); Iterator itr = windows.iterator(); //patName will provide you parent window String patName = itr.next(); //chldName will provide you child window String chldName = itr.next(); //Switch to child window driver.switchto().window(chldName); //Do normal selenium code for performing action in child window //To come back to parent window driver.switchto().window(patName);