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


一、定位元素的方法

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

      如果沒有且很難找到唯一屬性,解決方法:(1)找開發把id或者name加上。如果不行,解決思路可以是:

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

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

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

    findElement和findElements的區別:

    findElement返回一個元素對象,否則拋出異常。

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

    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  寫的相當詳細

  • 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’]

二、如何用xpath定位:

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

   第一種方法:通過絕對路徑做定位

By.xpath("html/body/div/form/input")
By.xpath("//input")
第二種方法:通過元素索引定位
By.xpath("//input[4]")
第三種方法:使用xpath屬性定位(結合第2、第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,'那么美')]")
三、定位頁面元素常見的問題
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去處理,所以這個需要后期請教大神了解。

基本了解到的就這些啦!



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM