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

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

iframe嵌套新页面ios滚动错屏问题 iframe嵌套页面定位元素_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嵌套新页面ios滚动错屏问题 iframe嵌套页面定位元素_firefox_02

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

iframe嵌套新页面ios滚动错屏问题 iframe嵌套页面定位元素_firefox_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嵌套新页面ios滚动错屏问题 iframe嵌套页面定位元素_用户名_04

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

iframe嵌套新页面ios滚动错屏问题 iframe嵌套页面定位元素_用户名_05

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

iframe嵌套新页面ios滚动错屏问题 iframe嵌套页面定位元素_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邮箱");
    	 }

     }	}