以126邮箱为例,自己来写webdriver脚本。

打开126邮箱后,首先定位用户名,firebug获取到用户名的属性如下:

iframe嵌套grafana 修改样式_System

通过firepath插件可以很容易得到用户名的Xpath为:.//*[@id='auto-id-1489561679556'],则 理论上 对应的webdriver 语句为: WebElement username=driver.findElement(By.xpath(".//*[@id='auto-id-1489561679556']));

对应的java 代码为:

package studybymyself;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;public class test_mailbox126 {
 public static void main(String[] args) throws InterruptedException {
 /*System.setProperty("webdriver.gecko.driver", "D:\\Tools\\geckodriver-v0.11.1-win64\\geckodriver.exe");
 System.setProperty("webdriver.firefox.bin","D:\\firefox\\firefox.exe");*/

 WebDriver driver = new FirefoxDriver(); 
 driver.get("http://mail.126.com/");
 Thread.sleep(5000);

 WebElement username=driver.findElement(By.xpath(".//*[@id='auto-id-1489561679556']"));
 username.clear();
 username.sendKeys("AAAA");}
}

但是运行时,发现系统报错 Unable to locate element: .//*[@id='auto-id-1489561679556']

iframe嵌套grafana 修改样式_python_02

再次通过firebug定位用户名的Xpath,发现Xpath已经发生变化,变为.//*[@id='auto-id-1489563060506']

iframe嵌套grafana 修改样式_用户名_03

然后多次通过firebug跟踪用户名的XPath,发现.//*[@id='auto-id-XXXX']中的XXX每次都不一样。

万幸的是前面那串@id='auto-id-  不变,瞬间想起了Xpath的startwith,对应的语句为 WebElement username=driver.findElement(By.xpath("starts-with(@id,'auto-id-']"));  

但是运行时 还是报错,找不到用户名元素。。。。

iframe嵌套grafana 修改样式_用户名_04

自己百度了一下,原来遇到iframe了!其实元素是否嵌套在iframe里面,通过firebug 一眼就看出来了,不过我们习惯性忽略这个位置了。。。

iframe嵌套grafana 修改样式_python_05

firebug的右上角清楚的写到【iframe#x-URS-iframe】,其中x-URS-iframe 表示iframe的id,此时在firebug中,username元素向上展开几层,就能发现iframe的详细信息了

iframe嵌套grafana 修改样式_System_06

对应的切换到iframe代码为:

driver.switchTo().frame("x-URS-iframe");
WebElement username=driver.findElement(By.name("email"));
username.clear();
username.sendKeys("AAA");

以后在firebug中查看元素的Xpth时,一定要记得看右上角,只要元素对应的导航条有iframe的字样,就必须切换对应的iframe才能定位到元素;

记得:当iframe上的操作完后,想重新回到主页面上操作元素,例如:登录成功后进入邮箱详情界面的时候,就可以用switch_to_default_content()方法返回到主页面,否则用户的操作总在iframe范围内,还是无法定位到元素啊。

好的,登录126邮箱完整的代码为

package studybymyself;
import junit.framework.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;public class mailbox126 {
 public static void main(String[] args) throws Exception {

 /*System.setProperty("webdriver.gecko.driver", "D:\\Tools\\geckodriver-v0.11.1-win64\\geckodriver.exe");
 System.setProperty("webdriver.firefox.bin","D:\\firefox\\firefox.exe");*/

 WebDriver driver = new FirefoxDriver(); 
 driver.get("http://mail.126.com/");
 Thread.sleep(3000);

 //由于126邮箱是嵌套的iframe窗口,由于用户名和密码内嵌在frame里边,所以有时通过单独的id/name/xpath还是定位不到此元素,以下两种写法不可用
 //WebElement username=driver.findElement(By.xpath("//div[@class='u-input box']/input[@name='email']"));
 //WebElement username=driver.findElement(By.name("email"));

 //selenium会直接包含iframe的内容,而selenium2却不会包含,需要自己引入iframe,引入方式如下:driver.switchTo().frame("x-URS-iframe");
 driver.switchTo().frame("x-URS-iframe");
 WebElement username=driver.findElement(By.name("email"));
 username.clear();
 username.sendKeys("AAAA");


 WebElement pwd = driver.findElement(By.name("password"));
 pwd.clear();
 pwd.sendKeys("BBBB");

 WebElement btn = driver.findElement(By.id("dologin"));
 btn.click();
 Thread.sleep(8000);

 //从frame中切回主界面,切到frame后,我们不能继续操作主界面,这个时候如果想操作主界面,则需要切回主界面
 driver.switchTo().defaultContent();

 WebElement success = driver.findElement(By.xpath("//span[@id='spnUid']")); 
 String context = success.getText();
 System.out.println("----------"+context);
 verifyTextPresent("hbali@126.com",context);
 driver.quit();

 }

 public static void verifyTextPresent(String expected,String actual){
 try
 {

 Assert.assertEquals(expected, actual);
 System.out.println("正确打开邮箱,页面显示用户名为"+actual);
 }
 catch (Exception e)
 {
 System.out.println("没有打开126邮箱");
 }

 } }