定位頁面元素之xpath詳解以及定位不到測試元素的常見問題

1、定位元素的方法css

  • id:首選的識別屬性,W3C標準推薦爲頁面每個元素設置一個獨一無二的ID屬性,

      若是沒有且很難找到惟一屬性,解決方法:(1)找開發把id或者name加上。若是不行,解決思路能夠是:html

      1. 找到該按鈕的特徵,例如按鈕的文字是 submit;sql

      2. 用XPath定位,能夠這樣寫://button[@value='submit']。(注意是單引號!!)windows

  • name:和id一致
  • ClassName:對某些具備相同類的元素一網打盡的好方法
  • link text 和 partial link text: 用在定位超連接上比較多
  • tag name:與class name有點相似,可是結果多個,多用List顯示:

    findElement和findElements的區別:app

    findElement返回一個元素對象,不然拋出異常。框架

    findElements返回符合條件的元素List,若是不存在符合條件的元素就返回一個空的List。dom

    View Code
  • css selector:熟悉jQuery比較容易定位到,可見  http://saucelabs.com/resources/selenium/css-selectors   。#爲class,.爲name
  • jQuery:即便用js來執行查詢定位,調用JavascriptExecutor類來執行jQuery的find()方法來查找元素,可參照

          博主  http://www.cnblogs.com/tobecrazy/p/4817946.html  寫的至關詳細ide

  • xpath:以上方式都定位不到的均可以用這種方法,可是記得優化路徑,而不是。。。 /html/body/div/div[2]/div[2]/div[2]/div[5]/div/p[2]......性能不好的好麼!

xpath缺點:佈局

1. 性能差,定位元素的性能比起大多數其餘方法要差;性能

2. 不夠健壯,XPath會隨着頁面元素佈局的改變而改變,可讀性差,幾乎不能維護

xpath優勢:

1. XPath能夠經過某個元素找到它的祖先(Ancestors)(」/../」 或者 「ancestor-or-self::book」);

2. 能夠作布爾邏輯判斷,例如/button[@value=’submit’ or @name=’tijiao’]

2、如何用xpath定位:

定位路徑能夠是相對路徑,也能夠是絕對路徑。絕對定位路徑以一個斜線「/」開頭,而相對定位路徑則沒有。如:/div/input 和 div/input

   第一種方法:經過絕對路徑作定位

By.xpath("html/body/div/form/input")
By.xpath("//input")
第二種方法:經過元素索引定位
By.xpath("//input[4]")
第三種方法:使用xpath屬性定位(結合第二、第3中方法可使用),前面用:tagName [@ 屬性='屬性值'] 表示
By.xpath("//input[@id='kw1']")
By.xpath("//input[@type='name' and @name='kw1']")
第四種方法:使用部分屬性值匹配(最強大的方法)
By.xpath("//input[start-with(@id,'nice')
By.xpath("//input[ends-with(@id,'很漂亮')
By.xpath("//input[contains(@id,'那麼美')]")
3、定位頁面元素常見的問題
1.元素顯示有id,可是就是定位不到(不知道爲何,諮詢某個羣主說是定位原理不同)換定位方式,如name,xpath,!!!!
2.未設置等待時間,未找到元素前就執行操做,致使報錯,解決方法:
(1)顯示等待:就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間以內都沒找到,那麼就跳出Exception
new WebDriverWait(driver, 15).until(
    ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator"))
);
 

或者能夠這樣寫

複製代碼
WebDriver driver = new FirefoxDriver();
driver.get( http://somedomain/url_that_delays_loading);
WebElement e = (new WebDriverWait( driver, 10)) .until(
    new ExpectedCondition< WebElement>(){  //等10秒直到找到id元素
        @Override
        public WebElement apply( WebDriver d) {
            return d.findElement( By.id("id locator"));
        }
    }
);
複製代碼
(2)WebDriver會進行一個隱式等待,但參數只有時間,這就致使我須要什麼元素出現,我不必定能等到它,只是讓driver延遲一段時間再繼續而已. 
隱式等待 driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); 
不過咱們也能夠把它小小的封裝一下:
複製代碼
public boolean isByElementDisplayed(By by, int time) {
    boolean status = false;
    if (driver.findElement(by).isDisplayed() == false) {
        driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
    } else {
        status = true;
    }
    return status;
}
複製代碼

(3)線程休眠: Thread.sleep(3000);

3.動態id,建議使用xpath的相對路徑定位

4.輸入框和按鈕組合,輸入框輸入後沒有失去焦點,層級覆蓋,致使找不到按鈕,設置等待便可!!!!!!

5.iframe框架,時間控件和地圖選擇控件後續介紹!!!

6.富文本編輯框,內嵌html,如 UEeditor,可以使用js,絕對管用

      String text = "你好呀";
             String js = "document.getElementById('ueditor_0').contentDocument.write('" + text + "');";
             ((JavascriptExecutor) driver).executeScript(js);

7.最揪心的是模態窗口不知道是個什麼鬼。首先不是新開一個窗口,不能用windowshandle定位,另外也沒有用iframe框架,再者也不屬於彈出框,不能用switchTo去處理,因此這個須要後期請教大神瞭解。

基本瞭解到的就這些啦!

相關文章
相關標籤/搜索