以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邮箱");
}
}
}