标签内的<!->可用时,无法使用文本找到元素

时间:2019-06-27 12:13:11

标签: java selenium xpath

具有如下所示的HTML代码。我想使用文本SOFTWATE定位元素。

<label _ngcontent-c5="" class="form-check-label" style="" xpath="1">
  <input _ngcontent-c5="" class="form-check-input ng-untouched ng-pristine ng-valid" type="checkbox">
  <!----> 
  <!---->
  <span _ngcontent-c5="" class="checkmark">
  </span>
  SOFTWARE 
</label>

尝试使用xpath //div[@class='filter-item-wrapper activate']//label[contains(text(),'SOFTWARE')],但没有运气。

任何人都可以使用文本“ SOFTWARE”来帮助找到元素的位置

4 个答案:

答案 0 :(得分:1)

尝试以下操作可能会起作用。

//div[@class='filter-item-wrapper activate']//label[contains(.,'SOFTWARE')]

答案 1 :(得分:1)

这就是为什么我们总是建议人们避免使用text()直接访问文本节点的原因。使用string()访问包含元素的字符串值几乎总是更好,最大的区别之一是string()的结果不受添加或删除注释的影响。

因此,请使用contains(string(), 'SOFTWARE') -可以将其缩写为contains(., 'SOFTWARE'),因为在需要字符串并提供节点时,对string()的调用是隐式的。

答案 2 :(得分:0)

想必您根本不想定位元素,但是您也想在复选框click(),并要实现这一点 WebDriverWait ,使元素可以点击,并且您可以使用以下Locator Strategy

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label.form-check-label>input.form-check-input.ng-untouched.ng-pristine.ng-valid[type='checkbox']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='form-check-label' and normalize-space()='SOFTWARE']/input[@class='form-check-input ng-untouched ng-pristine ng-valid']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

答案 3 :(得分:0)

您可以尝试:

//div/descendant-or-self::label[normalize-space(.)='SOFTWARE']

这应该在尝试匹配文本之前删除任何其他前导或尾随空格。