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