【问题标题】:Element stale or not clickable errors in selenium硒中的元素过时或不可点击错误
【发布时间】:2020-11-28 23:51:30
【问题描述】:

作为一个预警,我对编写代码非常陌生,只是把它作为一种爱好,所以如果我的行话不正确,我深表歉意。

我编写了一些代码来导航到一个网页,然后一遍又一遍地刷新该页面,直到出现某个元素(当前是一个类),然后单击该类。我不需要网站导航部分的帮助(该网站上的其他问题和答案对于找出该过程中的症结非常有帮助),但是当元素最终出现并且 selenium 尝试单击该元素时,我经常收到错误消息.我看到了一些不同的错误消息,包括:

  • h4 class="start" 的元素引用已过时;要么元素不再附加到 DOM,它不在当前框架上下文中,要么文档已被刷新;或
  • 元素在点 (706,145) 处不可点击,因为另一个元素 li class="loading-wrapper loading" 遮住了它。

以下是代码的相关部分:

i = 0
while i == 0:
    if len(driver.find_elements_by_class_name("start")) == 0:
        driver.find_element_by_class_name("active.day").click() #this just refreshes the page
        time.sleep(0.1)
        continue
    else:
        break
driver.find_elements_by_xpath("//*[@class='start' and starts-with(text(), '7')]")[0].click()

下面是我尝试点击的“开始”元素出现之前网站相关部分的示例:

<div id="content" class="row">

    <ul id="times" class="col-md-12"> 

        <li class="time empty muted">

            <h1>No tee times available</h1>

            <p>Booking for 8/09/2020 starts at 7:00pm (PDT)</p>

        </li>

    </ul>

</div>

下面是我尝试单击的“开始”元素出现后 HTML 相关部分的示例:

  <div class="reserve-time">
    
    <div class="pull-left">

        <h4 class="start">7:38am</h4>
        
        <div class="holes" style="margin-right: 0.5em;">

            <i class="glyphicon glyphicon-flag"></i> <span class="holes">18</span>

        </div>
        
        <div class="spots">
            
            <i class="glyphicon glyphicon-user"></i> <span class="spots">3</span>
        
         </div>
        
    </div>

    <div class="pull-right">

        <div class="price">
            
            <span title="Green Fee">

            <i class="icon-golf-ball-tee" style="font-size: 1em;"></i>

            $33.00

        </span>
            
        </div>

    </div>
    
</div>

提前感谢您的帮助!

附: - 我希望 HTML 在帖子中显示正常。我无法将 HTML 复制到帖子中并显示出来。

【问题讨论】:

    标签: python html selenium


    【解决方案1】:

    您可以等到元素可见,一旦可见,您就可以点击该元素。下面的代码将帮助您实现这一目标。

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 10)
    
    Start_Element = wait.until(expected_conditions.visibility_of_element_located((By.XPATH, "//h4[@class='start']")))
    Start_Element.click()
    

    【讨论】:

    • 当开始元素出现时,会有 10-20 个。是否可以等待元素对其中的特定元素可见?例如,当我单击元素时,通过在 driver.find_elements 行的末尾添加 [0]、[1]、[2] 来单击第 1、2、3 等,如下所示: .find_elements_by_xpath("//*[@class='start' and starts-with(text(), '6')]")[0].click()
    【解决方案2】:

    Selenium 无法单击它看不到的对象 - 就像您无法单击网页上看不到的东西一样。在调试 Selenium 代码时,我所做的是在崩溃的行之前添加一个“睡眠”10 分钟。然后,在打开的浏览器中,我查看我尝试单击的元素是否可访问。

    在您的情况下,听起来好像有一个加载屏幕遮住了它。我建议不要使用显式休眠 (time.sleep(0.1)),而是使用 webdriver.implicitly_wait(10) 等待长达 10 秒以使元素可见。如果这不起作用,请考虑上面的调试方法,您可以在浏览器中实际尝试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 2019-11-28
      • 1970-01-01
      • 2016-07-08
      • 2019-01-26
      • 2022-11-13
      • 2018-02-04
      • 2016-12-29
      相关资源
      最近更新 更多