2012-09-07 87 views
125

我試圖用Selenium測試一個複雜的JavaScript接口(使用Python接口和跨多個瀏覽器)。我有許多形式的按鈕:如何在Selenium Webdriver(Python)中找到包含特定文本的元素?

<div>My Button</div> 

我希望能夠搜索基於「我的按鈕」按鈕(或不區分大小寫,如「我的按鈕」部分匹配或「按鈕」)

我發現這非常困難,在某種程度上,我覺得我失去了一些明顯的東西。目前爲止我所能做的最好的事情是:

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]') 

但是這是區分大小寫的。我試過的另一件事是迭代頁面上的所有div,並檢查element.text屬性。但是,每次你得到的形態的情況:

<div class="outer"><div class="inner">My Button</div></div> 

div.outer也有「我的按鈕」的文字。爲了解決這個問題,我試着去查看div.outer是否是div.inner的父類,但是不知道如何做(element.get_element_by_xpath('..')返回元素的父元素,但是它測試不等於div.outer)。此外,重複瀏覽網頁上的所有元素似乎非常慢,至少使用Chrome網絡驅動器。

想法?

編輯:這個問題有點含糊。問(回答)一個更具體的版本在這裏:How to get text of an element in Selenium WebDriver (via the Python api) without including child element text?

+0

目前的答案並沒有爲我工作。這一個做到了:http://sqa.stackexchange.com/a/2486 – alejandro

回答

19

你可以嘗試的XPath,如:

'//div[contains(text(), "{0}") and @class="inner"]'.format(text) 
+0

謝謝...這樣可以幫助區分內部和外部,但實際上xpath可以很好地工作,我只是通過遍歷所有div來解決這個問題。我的xpath問題是我無法弄清楚如何使它不區分大小寫? – josh

+1

的xpath 2.0具有小寫功能,所以這應該工作: '// DIV [含有(小寫(文本()), 「{0}」)]' 格式(文本) – andrean

+0

謝謝!儘管我的理解是主流瀏覽器不支持xpath 2.0 ... – josh

162

嘗試以下操作:

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]") 
+1

謝謝你的回覆,這是我需要的50%(讓我開始)。我到達的表單就是這個「(// * [contains(text(),'」+ text +「')] | // * [@ value ='」+ text +「'))」它會搜索給定的文本不僅在元素節點內,而且還在文本通過「value」屬性設置的輸入元素內部,即

+7

其他搜索引擎訪問者也值得一提:如果你正在尋找一個鏈接,有'find_element(s)_by_link_text'和'find_element(s)_by_partial_link_text'方法 –

+2

如果文本是動態的,該怎麼辦?也就是說,可能包含引號。這不會破壞這個解決方案嗎? – IcedDante

-12

試試這個。它很容易:

driver.getPageSource().contains("text to search"); 

這真的在我的硒web驅動程序工作。

+6

如果文本是由JavaScript生成的,則不起作用。 – palacsint

+2

這是檢查它的一種非常方式,因爲您正在通過電線傳輸頁面的全部內容。對於非常小的頁面這是可以接受的,但對於非常大的頁面,您將傳輸文件的所有內容並在服務器端進行檢查。更好的方法是使用xpath,javascript或css在客戶端執行此操作。 –

+0

我認爲整個頁面源代碼已經需要通過電纜傳輸給瀏覽器來渲染它了嗎? –

3

您還可以使用頁面對象模式使用它,e.g:

試試這個代碼:

@FindBy(xpath = "//*[contains(text(), 'Best Choice')]") 
WebElement buttonBestChoice; 
1
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(), 'YourTextHere')]"))); 
    assertNotNull(driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]"))); 
    String yourButtonName=driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")).getAttribute("innerText"); 
    assertTrue(yourButtonName.equalsIgnoreCase("YourTextHere")); 
相關問題