在HTML中iframe的作用主要是在网页内内嵌了一个网页,所以我们在定位元素时,需要切换到iframe标签内才能定位到我们需要的元素。在java中使用driver.switchTo().frame();选择元素所在的iframe,即可切换到iframe标签内,这跟切换句柄是一个道理。要切换回最外层的页面,只需要使用driver.switchTo().defaultContent();即可切换回最外层。这里以qq邮箱为例子介绍一下iframe的处理。
当我们登录邮箱的时候,如果我们使用之前所介绍的方法去定位的话,是定位不了的,因为qq邮箱的登录框是一个使用了iframe标签的元素。如何判断登录框在iframe标签内?只需要查看登录框元素所在的结构即可,就像下图所示:
我们找到了登录框位于iframe标签之后,调用下面的方法即可进入到iframe标签内对登录框做操作了。如果需要定位的元素有多个iframe标签,那么需要一层一层的进行切换。
driver.switchTo().frame("login_frame");
以上是关于iframe的处理,附上完整的代码:
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
/**
* 登录到qq邮箱内,循环发送邮件
* @author gagaga
*
*/
public class Test_Email {
public static void main(String[] args) throws InterruptedException {
//打开浏览器
String driverPath=System.getProperty("user.dir")+"/geckodriver-v0.21.0-win64/geckodriver.exe";
System.setProperty("webdriver.gecko.driver",driverPath);
WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
driver.get("https://mail.qq.com/");
Thread.sleep(1000);
//切换到login_frame内
driver.switchTo().frame("login_frame");
String username=inputNotnull();
SendByCss(driver, "#u", username);
String password=inputNotnull();
SendByCss(driver, "#p", password);
driver.findElement(By.id("login_button")).click();
//返回最外层页面
driver.switchTo().defaultContent();
Thread.sleep(1000);
driver.findElement(By.id("composebtn")).click();
Thread.sleep(1000);
driver.switchTo().frame("mainFrame");
//循环发送邮件
for(int i=1;i<=10;i++) {
String s="这是第"+i+"封邮件";
String email=inputNotnull();
SendByXpath(driver, "/html/body/form[2]/div[2]/div[3]/div[2]/table[2]"
+ "/tbody/tr/td[2]/div[1]/div[2]/input", email);
driver.findElement(By.id("subject")).clear();
driver.findElement(By.id("subject")).sendKeys(s);
//进入到定位到的iframe中
WebElement iframe=driver.findElement(By.className("qmEditorIfrmEditArea"));
driver.switchTo().frame(iframe);
driver.findElement(By.xpath("/html")).clear();
driver.findElement(By.xpath("/html")).sendKeys(s);
driver.switchTo().defaultContent();
//切换到mainFrame
driver.switchTo().frame("mainFrame");
driver.findElement(By.xpath("//*[@id=\"toolbar\"]/div/a[1]")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("//*[@id=\"btnagainl\"]")).click();
}
}
//通过css添加内容
public static void SendByCss(WebDriver driver,String css,String message) {
driver.findElement(By.cssSelector(css)).clear();
driver.findElement(By.cssSelector(css)).sendKeys(message);
}
//通过xpath添加内容
public static void SendByXpath(WebDriver driver,String xpath,String message) {
driver.findElement(By.xpath(xpath)).clear();
driver.findElement(By.xpath(xpath)).sendKeys(message);
}
//输入内容
public static String inputNotnull() {
String s;
String n;
Scanner in=new Scanner(System.in);
n=in.nextLine();
if(n.isEmpty()==true) {
System.out.println("内容不能为空,请重新输入:");
Scanner in1=new Scanner(System.in);
s=in1.nextLine();
return s;
}
return n;
}
}