我正在尝试从网站上的某个元素中提取一些属性,但是却无法找到元素错误。除了属性以外,该元素没有太多要搜索的信息,并且我想要的元素每次都会更改。
我最初是将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:']"}
答案 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}}(子代或孙子)演示:
答案 4 :(得分:0)
您可以尝试以下方法:
browser.find_elements_by_cssselector(".copySource.copyEndLine")
如果元素在框架中,则必须切换到该框架,您可以使用以下方法:
driver.switchTo().frame("FrameName");