在页面操作过程中有时候点击某个链接会弹出新的窗口, 这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switchTo().window()方法可以实现在不同的窗口之间切换。
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import java.util.Set; public class MailLogin { public static void main(String[] args) throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("http://www.126.com"); //获得当前窗口句柄 String search_handle = driver.getWindowHandle(); WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe")); driver.switchTo().frame(xf); driver.findElement(By.name("email")).clear(); driver.findElement(By.name("email")).sendKeys("lovepeibenben"); Thread.sleep(1000); driver.findElement(By.name("password")).clear(); driver.findElement(By.name("password")).sendKeys("1a2b3c4d5e6gpei"); Thread.sleep(1000); driver.findElement(By.id("dologin")).click(); driver.switchTo().defaultContent(); System.out.print(driver.getCurrentUrl()); System.out.print(driver.getTitle()); //获得所有窗口句柄 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.linkText("设置")).click(); Thread.sleep(2000); driver.findElement(By.linkText("常规设置")).click(); Thread.sleep(2000); //关闭当前窗口 driver.close(); } else { Thread.sleep(2000); driver.findElement(By.linkText("设置")).click(); Thread.sleep(2000); driver.findElement(By.xpath("//*[@id="_mail_component_82_82"]/li[1]")).click(); Thread.sleep(2000); //关闭当前窗口 driver.close(); } } driver.quit(); } }
在本例中所涉及的新方法如下:
- getWindowHandle(): 获得当前窗口句柄。
- getWindowHandles(): 返回的所有窗口的句柄到当前会话。
- switchTo().window(): 用于切换到相应的窗口,与上一节的switchTo().frame()类似,前者用于不同窗口的切换, 后者用于不同表单之间的切换。