2017-07-22 64 views
0

我喜歡驗證標籤'Name'在我們的頁面上顯示#次,並想知道如何使用cssSelector來查找該元素?Selenium - 如何使用cssSelector找到多個元素

這是元素:

<div class="entity-label ng-binding" ng-bind-html="entity.Label">Name</div> 

這是我現在有,但不知道如何添加「名稱」給它。

private By lblNameField = By.cssSelector("[class='entity-label ng-binding'][ng-bind-html='entity.Label'"); 

Image of my source

+0

的'Name'在格是文本不是名字,你可以使用XPath與'DIV [包含(文本(), 「姓名」)]' –

+0

本帖](https://開頭stackoverflow.com/a/30648604/4039840)可能會幫助你 –

回答

0

不,你不能。唯一的方法是使用Xpath。使用text()='your text'contains(text(),'your text')作爲查找元素的條件。

private By lblNameField = By.xpath("//*[@class='entity-label ng-binding' and text()='Name']"); 
+0

我也試過你的xpath,它找不到名稱字段。如果我使用Chrome Dev並執行xpath,我可以找到它,但它看起來很亂 - '// * [@ id =「ResultsData」]/div/ol/li [*]/ol/li [1]/div [1]' –

+0

'@ class ='entity-label ng-binding'是不好的做法,因爲它們是兩個不同的類,它們不保證以此順序出現。 – SiKing

+0

@JeffreyNg我忘記提及xpath是區分大小寫的。您可能需要將「名稱」更改爲「名稱」。 – Buaban

0

從技術上講,您可以使用CSS選擇器進行搜索,但僅靠定位器無法找到您想要的元素。您將不得不遍歷所有元素,並使用.getText()查找包含的文本。下面是一個例子

List<WebElement> labels = driver.findElements(By.cssSelector("div.entity-label.ng-binding[ng-bind-html='entity.Label']")); 
int count = 0; 
for (WebElement label : labels) 
{ 
    if (label.getText().equals("Name")) 
    { 
     count++; 
    } 
} 
System.out.println(count); 

的更有效的方式來做到這一點(和定位與包含文本的元素的方式)是使用的XPath。 XPath將包含您正在查找的文本,以便只使用定位器就可以找到所需的所有元素。下面的代碼將返回您正在查找的元素的數量。

driver.findElements(By.xpath("//div[.='Name'][ng-bind-html='entity.Label']")).size(); 
+0

它仍然沒有找到xpath,我仍然得到0計數0 'public int countName(){ int nameCount; nameCount = driver.findElements(By.xpath(「// div [。='Name'] [ng-bind-html ='entity.Label']」))。size(); System.out.println(nameCount); return nameCount; }' –

+0

我想我想通了,我不得不將xpath切換到driver.findElements(By.xpath(「// * [@ class ='entity-label ng-binding'] [。='Name ']「))。尺寸()​​;這似乎工作。 –

+0

這很奇怪......你在問題中提供的HTML顯示一個'DIV',所以應該工作。我會仔細檢查你得到的元素是你期望的。你可以再次檢查HTML並更新問題,如果事情也改變了。 – JeffC

相關問題