Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法定位元素-多个元素似乎具有相似且最小的信息,我可以';两者都找不对_Python_Selenium_Xpath_Css Selectors_Webdriverwait - Fatal编程技术网

Python 无法定位元素-多个元素似乎具有相似且最小的信息,我可以';两者都找不对

Python 无法定位元素-多个元素似乎具有相似且最小的信息,我可以';两者都找不对,python,selenium,xpath,css-selectors,webdriverwait,Python,Selenium,Xpath,Css Selectors,Webdriverwait,我试图从网站上的元素中提取一些属性,但找不到元素错误。除了属性之外,元素中没有太多要搜索的信息,我想要的属性每次都会更改 我最初将HTML转换为文本,然后正则表达式搜索文本以获得我想要的内容。现在我想让它更优雅一点 我试过: 浏览器。按名称(“状态”)查找元素 搜索文本属性(我知道这是错误的) browser.通过xpath(//label[@class='copySource'])查找元素 还有其他一些变化 浏览器。通过xpath(“//element[@attribute='Device

我试图从网站上的元素中提取一些属性,但找不到元素错误。除了属性之外,元素中没有太多要搜索的信息,我想要的属性每次都会更改

我最初将HTML转换为文本,然后正则表达式搜索文本以获得我想要的内容。现在我想让它更优雅一点

我试过:
浏览器。按名称(“状态”)查找元素

  • 搜索文本属性(我知道这是错误的)
    browser.通过xpath(//label[@class='copySource'])查找元素

  • 还有其他一些变化
    浏览器。通过xpath(“//element[@attribute='Device Status:']”)查找元素

再加上一些其他的东西

使用此选项,使用
查找所有元素
,返回一个空白列表,没有错误。
浏览器。通过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>
试一试

browser.find_element_by_css_selector(".copyEndLine").text
您可以尝试在获取元素文本之前添加一个等待条件,例如“等待元素出现”,因为在与它交互时,它可能尚未加载。

尝试使用

browser.find_element_by_css_selector(".copyEndLine").text

在获取元素文本之前,您可能会尝试添加一个等待条件,例如“等待元素出现”,因为当您与它交互时,它可能尚未加载。

要提取文本可操作,您必须为位于()的元素的
可见性诱导WebDriverWait
您可以使用以下任一选项:

  • css选择器

    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"))
    
  • 注意:您必须添加以下导入:

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

要提取文本可操作您必须为位于()的元素的
可见性诱导WebDriverWait,并且您可以使用以下任一项:

  • css选择器

    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"))
    
  • 注意:您必须添加以下导入:

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

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

您可以尝试:
浏览器。通过xpath(“//span[@class='class']]”[0]
或任何其他索引查找元素;基于页面上类似组件的计数


另外,如果您可以共享您正在尝试的页面的url,这将非常有用。

通常情况下,当存在具有类似名称/标记的组件时,会发生这种情况

您可以尝试:
浏览器。通过xpath(“//span[@class='class']]”[0]
或任何其他索引查找元素;基于页面上类似组件的计数


另外,如果您可以共享您正在尝试的页面的url,这将非常有用。

相关的XPath表达式如下所示:

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

  • 祖先::tr
    -选择当前元素的相关表
  • 后代::*[contains(@class,'EndLine')]
    -通过XPath查找包含
    EndLine
    的(子代或孙代)
演示:


相关的XPath表达式类似于:

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

  • 祖先::tr
    -选择当前元素的相关表
  • 后代::*[contains(@class,'EndLine')]
    -通过XPath查找包含
    EndLine
    的(子代或孙代)
演示:

您可以尝试以下方法:

browser.find_elements_by_cssselector(".copySource.copyEndLine")
如果图元位于框架内,则必须切换到框架,可以使用以下方法:

driver.switchTo().frame("FrameName");
您可以尝试以下方法:

browser.find_elements_by_cssselector(".copySource.copyEndLine")
如果图元位于框架内,则必须切换到框架,可以使用以下方法:

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

没有运气。尝试了元素并得到了相同的结果,“没有这样的元素:无法定位元素:{”方法“:”css选择器“,”选择器“:”.copyEndLine“}”将其更改为元素,并获得一个空列表[],并尝试立即延长等待时间,但仍然没有发现您在iframe中发布的HTML代码有任何可能?不走运。尝试了元素并得到了相同的结果,“没有这样的元素:找不到元素:{“方法”:“css选择器”,“选择器”:“.copyEndLine”}”将其更改为元素并获得一个空列表[],并尝试立即延长等待时间,但仍然没有发现您在iframe中发布的HTML代码。检查iframe中是否有该表。通常,如果元素在主窗口中,它应该与
td span.copyEndLine
css定位器一起工作。没有iFrame发现问题-需要深入指定更准确的xpath。这是否意味着从chrome复制xpath,然后粘贴到其他地方。我是个新手,我不知道我能做到这一点。解决了的!谢谢你的帮助,每一个你能做到的人。请核对我的答案。这可能会给你一些提示和帮助。检查Iframe中是否有该表。通常,如果元素在主窗口中,它应该与
td span.copyEndLine
css定位器一起工作。没有iFrame发现问题-需要深入指定更准确的xpath。这是否意味着从chrome复制xpath,然后粘贴到其他地方。我是个新手,我不知道我能做到这一点。解决了的!谢谢你的帮助,每一个你能做到的人。请核对我的答案。这可能会给你一些提示和帮助。我恐怕无法保护内部公司网站我恐怕无法保护内部公司网站