【问题标题】:Locating element by classname with double underscore使用双下划线按类名定位元素
【发布时间】:2020-02-03 02:41:45
【问题描述】:

我尝试按类名查找元素。不幸的是,我必须选择的类名包含双下划线并引发“没有这样的元素”错误。

div-element 选择:

<div class="result-list-entry__data">
...
</div>

选择:

last_named_class = result.find_element_by_class_name('result-list-entry__data')

当前结果(错误):

selenium.common.exceptions.NoSuchElementException: 消息:没有这样的 元素:无法找到元素:{“方法”:“css selector","selector":".result-list-entry__data"} (会话信息: 铬=77.0.3865.90)

双下划线可以转义吗?

【问题讨论】:

  • 我无法用您提供的信息重现您的问题。请提供minimal, reproducible example
  • 嗨,有代码和错误消息很好,但请注意寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为,一个特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:minimal reproducible example
  • 我可以保证双下划线不是问题。该元素尚未加载,或者它位于 iframe 中。

标签: python selenium


【解决方案1】:

试试下面的东西,

  1. 应用所需的等待(隐式或显式等待)
    driver.implicitly_wait(15)
wait = WebDriverWait(driver, 10)
wait.until(ec.visibility_of_element_located((By.XPATH, "//*[contains(@class,'result-list-entry')]")))
  1. 检查元素是否是 iframe 元素的子元素。如果是,切换到 iframe 并尝试点击

  2. 如果元素属性值频繁变化,则使用 xpath 和 contains

    last_named_class = result.find_element_by_xpath("//*[contains(@class,'result-list-entry')]")

【讨论】:

    【解决方案2】:

    您可以使用之前建议的方法,其中包含两个内容:

    last_named_class = result.find_element_by_xpath("//div[contains(@class, 'result-list') and contains(@class, 'data')]"
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用 class= "result-list-entry__data" 获取所有元素的列表

      如果 DOM 中有多个类,则根据位置迭代 elementResult 数组

       elementResult=[];
       elementResult = driver.find_elements_by_class_name("result-list-entry__data");
      

      其他

      elementResult = driver.find_elements_by_class_name("result-list-entry__data");
      

      【讨论】:

        【解决方案4】:

        首先,检查是否有任何 iframe。如果元素在 iframe 中,则必须先切换到框架,然后再对该元素执行任何操作。

        你可以使用类属性的部分字符串匹配来定位这个元素,像这样,

        last_named_class = result.find_element_by_xpath("//*[contains(@class,'result-list-entry')]")
        

        【讨论】:

          【解决方案5】:

          也许您可以在选择器中使用包含查询。试试这样的:

          last_named_class = result.find_element_by_xpath("//div[contains(@class, 'result-list')]")
          

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-08
            • 1970-01-01
            相关资源
            最近更新 更多