2012-08-16 89 views
2

我最近開始使用Selenium,並且我決定只使用Selenium 2/WebDriver。 在我的測試代碼中,我經常到達WebElement而不知道它在頁面中的位置。WebDriver Selenium API:在XPath中標識WebElement

我想要的代碼,給定一個WebElement,構造一個XPath表達式來唯一地選擇它。

Selenium的FireFox錄音機插件可以做到這一點;我要的是代碼來執行它在硒2.

我可以用WebElementfindElementwalk up the treefindElements找到我們來自的孩子寫這樣的代碼自己,但它是平凡的拿出東西快(一再呼籲By.xpath似乎不好),並完成(例如由於命名空間)。

A related question建議使用CSS選擇器來代替 - 這是我沒問題。)

有沒有人做到了這一點給我嗎?什麼是最好的方法?

回答

2

這是非常簡單的:btw是css是要走的路; xpath應該只被用作最後的手段。 http://sauceio.com/index.php/2010/01/selenium-totw-css-selectors-in-selenium-demystified/解釋css定位器比我在這裏提供的空間更深入。

最好的辦法:如果你使用firefox下載螢火蟲,那會讓你看看你的html。 Pres cmd + Shift + c,它會用元素熒光筆爲你打開。找到你的html元素,也許它會是這個樣子

<input type="submit" tabindex="110" value="Post Your Answer" id="submit-button"> 

然後你可以找到你的元素倒也乾脆

WebElement element = driver.findElement(By.cssSelector("input[id='submit-button']")) 

注意,我們把標記名第一個「輸入」,其次是某種括號內的唯一標識符「input [id ='submit-button']」。大多數情況下,這將覆蓋您使用的所有css定位器的75%。另外的25%需要在我放在頁面頂部的鏈接中包含一些更棘手的內容。

你可能會問:「我可以再說ID使用什麼樣的唯一標識符的」清楚,這裏涵蓋:http://release.seleniumhq.org/selenium-remote-control/0.9.2/doc/dotnet/Selenium.html

好運開始了

編輯

那麼好的運氣找到你元素放在第一位......如果您需要,您可以通過部分定位器文本來搜索元素,如input [id * ='submit']。當你使用部分文本作爲定位器的一部分時,使用它對動態生成的元素很有幫助。

你提到走上html樹,也許我沒有看到,當我第一次看到這個問題。我認爲你遇到了這個問題。不推薦使用html樹,因爲它會讓html測試變得更脆弱。從長遠來看,它也會使你的代碼不可讀。一般來說,如果你的ID缺失或不可預測,我會建議與proj交談。管理層讓開發人員編寫實際上可以實現自動化的代碼(例如:在關鍵元素上實現標識符)。這實際上可以節省您和開發人員的長期努力,並且還可以提高測試的速度和可靠性。

+0

謝謝!不幸的是,這並不能真正幫助我,因爲我的元素上的大多數ID缺失或不可預測。 – reinierpost 2012-08-20 08:45:16

2

也許這會幫助:我正在測試一個網站,其中的ID是動態生成的,所以他們一直在改變。爲了得到他們的XPath和工作用它,我用這個函數:

/** 
* Gets the absolute xPath for elements with dynamic ids. 
* 
* @param driver - the current WebDriver instance 
* @param element - the element for which the xPath will be found 
* @return the absolute xPath for this element 
*/ 
public static String getElementXPath(WebDriver driver, WebElement element) { 
    return (String)((JavascriptExecutor)driver).executeScript(
      "gPt=function(c)" + 
      "{" + 
      "if(c.id!=='')" + 
      "{return c.tagName + '[@id=\"'+c.id+'\"]'}" + 
      "if(c===document.body)" + 
      "{return c.tagName}" + 
      "var a=0;" + 
      "var e=c.parentNode.childNodes;" + 
      "for(var b=0;b<e.length;b++)" + 
      "{var d=e[b];" + 
      "if(d===c)" + 
      "{return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}" + 
      "if(d.nodeType===1&&d.tagName===c.tagName)" + 
      "{a++}" + 
      "}" + 
      "};" + 
      "return gPt(arguments[0]);", element); 
} 
+0

當然,如果你將它擴展到頁面內部的元素,這也是可行的,但是一旦你使用了JavaScript,我認爲從元素到文檔根就像上面描述的那樣效率更高。這種解決方案有多便攜? – reinierpost 2012-08-20 08:42:11

+0

這不會一直向上,直到找到一個帶有id的元素。至於可移植性,我只測試過Firefox,如果這就是你的意思。 – 2012-08-21 09:10:31

0

我們可以發現提交按鈕使用ID:

1.driver.findElement(By.id(「提交按鈕」 ))

ID> NAME> CSS> XPATH

+0

謝謝!不幸的是,這並不能真正幫助我,因爲我的元素上的大部分ID都缺失或不可預測。 – reinierpost 2014-04-07 10:05:55

相關問題