在页面操作过程中有时候点击某个链接会弹出新的窗口, 这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switchTo().window()方法可以实现在不同的窗口之间切换。
以百度首页和百度注册页为例,在两个窗口之间的切换如下图。
实现窗口切换的代码如下:
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class MoreWindows {
public static void main(String[] arge) throws InterruptedException{
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
//获得当前窗口句柄
String search_handle = driver.getWindowHandle();
//打开百度注册窗口
driver.findElement(By.linkText("登录")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("立即注册")).click();
//获得所有窗口句柄
Set<String> handles = driver.getWindowHandles();
//判断是否为注册窗口, 并操作注册窗口上的元素
for(String handle : handles){
if (handle.equals(search_handle)==false){
//切换到注册页面
driver.switchTo().window(handle);
System.out.println("now register window!");
Thread.sleep(2000);
driver.findElement(By.name("userName")).clear();
driver.findElement(By.name("userName")).sendKeys("user name");
driver.findElement(By.name("phone")).clear();
driver.findElement(By.name("phone")).sendKeys("phone number");
//......
Thread.sleep(2000);
//关闭当前窗口
driver.close();
}
}
Thread.sleep(2000);
driver.quit();
}
}
在本例中所涉及的新方法如下:
getWindowHandle(): 获得当前窗口句柄。
getWindowHandles(): 返回的所有窗口的句柄到当前会话。
switchTo().window(): 用于切换到相应的窗口,与上一节的switchTo().frame()类似,前者用于不同窗口的切换, 后者用于不同表单之间的切换。
按照这个代码执行来说总共就2个句柄,他判断不等于百度句柄得时候执行操作,不等于百度网页句柄等同于是百度注册网页得句柄。 search_handle 的赋值就是百度网页句柄
软件女青年 创建于 2020-07-07 15:09:28
前辈: 这里有一点想不通,望指点一二:if (handle.equals(search_handle)==false),这里指切换的句柄等于百度首页的句柄这个条件是错误的时候, driver.switchTo().window(handle);开始切换句柄。但是我们应该是要需要去注册页的句柄,那么不应该是if (handle.equals(search_handle))现在的句柄等于百度首页的句柄的时候,才切换句柄吗?想了好久也没想通,但是执行您的代码却没有任何问题,非常之疑惑。 还有想问问您的java+selenium什么时候出书呢,一直关注着,虽然有电子版,可还是希望能出书! 万分感谢!
将袍 创建于 2019-12-11 15:59:59
打卡
可爱的煤气罐 创建于 2018-12-14 14:13:46