如何使用Selenium在<span>中查找具有特定文本的元素

时间:2018-06-01 10:09:52

标签: java selenium selenium-webdriver xpath css-selectors

我正在使用Selenium WebDriver。我面临动态更改ID的问题。我已经阅读了Handle elements that have changing ids all the time through Selenium Webdriver之类的帖子,但没有找到可以帮助我的解决方案。

在XPath中包含start-withcontains无法提供帮助,因为有很多元素以类似的文本和id不断变化开头。请参阅下面的HTML以获得更清晰的信息。

<mat-option _ngcontent-c1="" class="__mat-option mat-option ng-star-inserted" 
     role="option" tabindex="0" id="mat-option-4" 
     aria-selected="false" aria-disabled="false">
   <span class="mat-option-text">
        <i _ngcontent-c1="" class="material-icons">description</i>
        <span _ngcontent-c1="" style="padding-left: 8px">Campaign Details</span>
   </span>
  <div class="mat-option-ripple mat-ripple" mat-ripple=""></div>
</mat-option>
  • 请注意上面HTML中的ID是动态的并且不断变化。
  • 还有更多这样的元素具有相同的类名。
  • 还有一些元素以mat-option-开头。
  • 唯一唯一的是<span>中的文字。

我尝试了driver.findElement(By.xpath(".//span[contains(text(), 'Campaign Details']"));,但没有为我工作。

3 个答案:

答案 0 :(得分:3)

根据您提供的用于将文字标识为广告系列详细信息的HTML,因为该元素是 Angular 元素,您必须诱导 WebDriverWait 使元素可见如下:

WebElement myElement = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//mat-option[@class='__mat-option mat-option ng-star-inserted' and @role='option'][starts-with(@id,'mat-option-')]/span[@class='mat-option-text']//span[contains(.,'Campaign Details')]")));

答案 1 :(得分:0)

唯一唯一的是<span>中的文字,因此文字为:广告系列详细信息

WebElement campaignDeatils =  driver.findElement(By.xpath("//i[text()='description']/following-sibling::span[text()='Campaign Details']"))  
campaignDeatils.getText(); // or any other operation you wanna do.

答案 2 :(得分:0)

WebElement campaignDeatils =  driver.findElement(By.xpath(""//i[@class='fa fa-bullhorn']/following-sibling::span[text()='Campaigns']"))  

campaignDeatils.getText();