无法找到元素-多个元素似乎具有相似且最少的信息,我找不到正确的一个

时间:2019-06-19 08:28:14

标签: python selenium xpath css-selectors webdriverwait

我正在尝试从网站上的某个元素中提取一些属性,但是却无法找到元素错误。除了属性以外,该元素没有太多要搜索的信息,并且我想要的元素每次都会更改。

我最初是将HTML转换为文本,然后正则表达式搜索文本以获取所需内容。现在,我试图使其更加优雅。

我尝试过:  browser.find_element_by_name("Status")

  • 搜索文本属性(我知道这是错误的) browser.find_element_by_xpath("//label[@class='copySource']")

  • 和其他许多变体 browser.find_element_by_xpath("//element[@attribute='Device Status:']")

加上其他一些东西。

将其与find all elements一起使用,返回了一个没有错误的空白列表。     browser.find_elements_by_xpath("//span[@class='class']")

我要搜索的代码:

<td>
    <label class="copySource">Device Registration Status:</label>
</td>
<tr>
    <td>
        <label class="copySource">Device Status:</label>
    </td>
    <td>
        <span class="copySource copyEndLine">operational</span>
    </td>
</tr>

我正在尝试在最后一个元素中提取属性,即单词“ operational”(此词会更改)。出现错误(或类似错误):

NoSuchElementException: no such element: Unable to locate element: 
{"method":"xpath","selector":"//element[@attribute='Device Status:']"}

5 个答案:

答案 0 :(得分:0)

尝试

browser.find_element_by_css_selector(".copyEndLine").text

您可能会尝试在获取元素的文本之前添加等待条件,类似于“等待元素存在”,因为在与之交互时可能尚未加载。

答案 1 :(得分:0)

要提取文本可操作,您必须为Number(<slot_value>)引入 WebDriverWait ,并且可以使用以下Locator Strategies中的任何一个:

  • visibility_of_element_located()

    cssSelector
  • print(WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "tr td>span.copySource copyEndLine"))).get_attribute("innerHTML"))

    xpath
  • 注意:您必须添加以下导入:

    print(WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, "//label[@class='copySource' and text()='Device Status:']//following::td[1]/span[@class='copySource copyEndLine']"))).get_attribute("innerHTML"))
    

答案 2 :(得分:0)

通常,当具有相似名称/标签的组件时会发生这种情况。

您可以尝试:browser.find_elements_by_xpath("//span[@class='class']")[0]或任何其他索引;基于页面上相似组件的数量。

另外,如果您可以共享您尝试的页面的URL,那将很有帮助。

答案 3 :(得分:0)

相关的XPath表达式将类似于:

//label[text()='Device Status:']/ancestor::tr/descendant::*[contains(@class,'EndLine')]

其中:

  • ancestor::tr-选择相关表tr tag,它是当前元素的ancestor
  • descendant::*[contains(@class,'EndLine')]-通过XPath descendant查找class attribute包含EndLine的{​​{3}}(子代或孙子)

演示:

contains() function

答案 4 :(得分:0)

您可以尝试以下方法:

browser.find_elements_by_cssselector(".copySource.copyEndLine")

如果元素在框架中,则必须切换到该框架,您可以使用以下方法:

driver.switchTo().frame("FrameName");