【问题标题】:Keep refreshing page until element is clickable?保持刷新页面直到元素可点击?
【发布时间】:2020-12-23 03:24:51
【问题描述】:

我目前正在尝试让我的代码不断刷新页面,直到网站上的特定元素变为可点击为止。示例代码如下:

lolSize = False
           

while not lolSize:
      try:
          if size.is_enabled():
               driver.execute_script("arguments[0].click();", size)
               lolSize = True
      except:
          time.sleep(1)
          driver.refresh()
        
        

现在,如果我在运行代码的确切时刻放置一个可点击的值,它就可以正常工作。但是,如果使用了当前不可点击的值,则页面根本不会刷新。如果我的代码有一些基本的不正确之处,我深表歉意,我是 Python 的新手。任何帮助表示赞赏,如果您需要澄清我的问题,请随时提问!谢谢! :)

【问题讨论】:

    标签: python selenium selenium-chromedriver


    【解决方案1】:

    您必须处理 if 语句的 else 条件

    while not lolSize:
          try:
              assert size.is_enabled()
              driver.execute_script("arguments[0].click();", size)
              lolSize = True
          except:
              time.sleep(1)
              driver.refresh()
    

    如果不为真,断言将引发异常,并在异常处理程序代码中进行刷新。

    另外,我相信通过提供的代码,在刷新 is_enabled() 代码时总是会引发异常。您需要在每次刷新时检索 size 元素以不具有staleElementException。这种异常每次都会用driver.refresh()循环你的代码。

    更新 为确保没有可点击的元素,请使用WebDriverWait 获取时间来查找元素

    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.common.by import By
     
    timeout_in_sec = 5. # how much time to check for a clickable element
    wait = WebDriverWait(driver, timeout_in_sec)
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'yourCssPath')))
    

    更新代码后:

    wait = WebDriverWait(driver, timeout_in_sec)
    
    while not lolSize:
          try:
              size = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'yourCssPath')))
              driver.execute_script("arguments[0].click();", size)
              lolSize = True
          except:
              time.sleep(1)
              driver.refresh()
    

    请注意,(By.CSS_SELECTOR, 'yourCssPath') 需要与您之前找到 size 的方式相匹配

    【讨论】:

    • 我明白了,很有趣。在这种情况下,您如何建议停止具有 staleElementException 的 size 元素?
    • 只需在 try/catch 中移动检索 size = driver.find_element... 的代码
    • 我明白了,我仍然无法为我工作。我在编码方面不是最聪明的,所以我很感激帮助。我基本上像您所说的那样放置了检索 size 元素的内容,但它不起作用。在assert size.is_enabled()之前,我把它放在了try的开头
    • size 元素的位置是正确的。你能澄清什么不起作用吗?您是进入异常处理程序还是永远无法访问该代码?该元素是否从未启用.. 如果是这样,您可以考虑使用element_to_be_clickable from expected_conditions
    • 啊,是的,抱歉,我应该在那里澄清很多(很着急,抱歉!)。基本上,即使存在可点击元素,页面也会保持刷新。
    【解决方案2】:

    我对这个问题的想法是这样的:

    while True: 
       try: 
          driver.execute_script("arguments[0].click();")
          break 
       except: 
              time.sleep(1)
              driver.refresh()      
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      相关资源
      最近更新 更多