如何使用Java处理SeleniumWebDriver中的新窗口?
这是我的代码:如何使用Java处理SeleniumWebDriver中的新窗口?,java,selenium-webdriver,new-window,Java,Selenium Webdriver,New Window,这是我的代码: driver.findElement(By.id("ImageButton5")).click(); //Thread.sleep(3000); String winHandleBefore = driver.getWindowHandle(); driver.switchTo().window(winHandleBefore); driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219"); 现在我有下一个错误:
driver.findElement(By.id("ImageButton5")).click();
//Thread.sleep(3000);
String winHandleBefore = driver.getWindowHandle();
driver.switchTo().window(winHandleBefore);
driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219");
现在我有下一个错误:
线程“main”org.openqa.selenium.NoSuchElementException中的异常:
找不到id==txtEnterCptCode的元素(警告:服务器
未提供任何stacktrace信息)
命令持续时间或超时:404毫秒
有什么想法吗?我有一个实用方法可以切换到所需的窗口,如下所示
public class Utility
{
public static WebDriver getHandleToWindow(String title){
//parentWindowHandle = WebDriverInitialize.getDriver().getWindowHandle(); // save the current window handle.
WebDriver popup = null;
Set<String> 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;
}
}
然后使用相同的方法再次切换到父窗口
Webdriver parentDriver=Utility.getHandleToWindow(“titleOfParentWindow”)代码>
此方法在处理多个窗口时有效。看起来您实际上并没有切换到任何新窗口。您应该获取原始窗口的窗口句柄,保存它,然后获取新窗口的窗口句柄并切换到该窗口。使用完新窗口后,需要将其关闭,然后切换回原始窗口句柄。请参见下面的示例:
i、 e
我有一个示例程序:
公共类浏览转发{
/**
* @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句柄=driver.WindowHandles;
foreach(句柄中的字符串句柄)
{
if(句柄!=BaseWindow)
{
字符串title=driver.SwitchTo().Window(handle.title);
睡眠(3000);
driver.SwitchTo().Window(句柄).Title.Equals(标题);
睡眠(3000);
}
}
设置windows=driver.getWindowHandles();
迭代器itr=windows.Iterator();
//patName将为您提供父窗口
字符串patName=itr.next();
//chldName将为您提供子窗口
字符串chldName=itr.next();
//切换到子窗口
driver.switchto()窗口(chldName);
//执行常规selenium代码以在子窗口中执行操作
//返回父窗口
driver.switchto().window(patName);
我在windowhandle上遇到一些问题,于是尝试了这个。这个对我有好处
String parentWindowHandler = driver.getWindowHandle();
String subWindowHandler = null;
Set<String> handles = driver.getWindowHandles();
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
subWindowHandler = iterator.next();
driver.switchTo().window(subWindowHandler);
System.out.println(subWindowHandler);
}
driver.switchTo().window(parentWindowHandler);
String parentWindowHandler=driver.getWindowHandle();
字符串子窗口处理程序=null;
Set handles=driver.getWindowHandles();
迭代器迭代器=handles.Iterator();
while(iterator.hasNext()){
subWindowHandler=iterator.next();
driver.switchTo().window(子WindowHandler);
System.out.println(子窗口处理程序);
}
driver.switchTo().window(parentWindowHandler);
现在我无法通过我的代码在新窗口的文本框中输入值。字符串parentHandle=driver.getWindowHandle();driver.findElement(By.id(“ImageButton5”))。单击();对于(字符串winHandle:driver.getWindowHandles()){driver.switchTo().window(winHandle);Thread.sleep(3000);driver.findElement(By.id(“txtEnterCptCode”))。sendKeys(“99219”);driver.findElement(By.id(“chklstAllprocedure_0”)。单击();我遇到的错误是在新打开的窗口中找不到textbox元素。您能帮我解决这个问题吗?@Arun Kumar:也许webDriver正在试图在页面完全加载之前找到该元素?ad.sleep无效,因为它所做的只是在运行下一行代码之前等待几秒钟。请尝试WebDriverWait类。::WebDriverWait wait=new WebDriverWait(driver,1000);WebElement element=wait.until(预期条件。元素的可视性已定位(By.id(“txtEnterCptCode”));element.sendKeys(“99219”);WebDriverWait将等待,直到您指定的元素可见…并且一旦它可见,它将继续运行您的代码…注意,我的wait.until部分代码中有一个输入错误。“预期条件”中应该没有空格。它应该是“预期条件”为什么要长时间睡眠?这是一个很糟糕的练习。这只是一个例子。返回WebDriver
实例没有意义,因为它与您已经使用的实例相同。
/**
* @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<string> 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);
}
}
Set<String> windows = driver.getWindowHandles();
Iterator<String> 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);
String parentWindowHandler = driver.getWindowHandle();
String subWindowHandler = null;
Set<String> handles = driver.getWindowHandles();
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
subWindowHandler = iterator.next();
driver.switchTo().window(subWindowHandler);
System.out.println(subWindowHandler);
}
driver.switchTo().window(parentWindowHandler);