定位元素遇到的各种坑----页面嵌套了iframe

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

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

通过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']

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

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

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

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

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

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

对应的切换到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邮箱");
}

}

}

 

转载于:https://www.cnblogs.com/alliefu/p/6554773.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值