首页 > 解决方案 > 如何在 Selenium 中“if else”(selenium.common.exceptions.StaleElementReferenceException)

问题描述

我现在要做的是检查按钮是否被硒禁用。如果按钮被禁用,它将不断刷新浏览器,它不会单击按钮。但是每当我执行程序时,它都会向我显示一些错误。有人对此错误有任何想法吗?提前致谢。

错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\heng\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:/Users/heng/PycharmProjects/testtest/Flash Sale Bot/bot.py", line 116, in startbot
    btnclass = belisekarang.get_attribute("class")
  File "C:\Users\heng\PycharmProjects\testtest\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 139, in get_attribute
    attributeValue = self.parent.execute_script(
  File "C:\Users\heng\PycharmProjects\testtest\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 634, in execute_script
    return self.execute(command, {
  File "C:\Users\heng\PycharmProjects\testtest\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\heng\PycharmProjects\testtest\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=88.0.4324.190)


我的代码:

def startbot():
    getproducturl = producturl.get()
    #getvaration = variation.get()
    gethour = timehour.get()
    gettime = timeminute.get()

    driver.get(getproducturl)
    #driver.find_element_by_xpath(getvaration).click()
    try:
        belisekarang = driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[2]/div[2]/div[2]/div[3]/div/div[5]/div/div/button[2]')
        belisekarang.click()
    except NoSuchElementException:
        driver.refresh()
    except StaleElementReferenceException:
        print("fafaf")

    btnclass = belisekarang.get_attribute("class")

    while True:
        if 'disabled' in btnclass:

           driver.refresh()
        else:
            belisekarang.click()


标签: pythonselenium

解决方案


belisekarang =WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="main"]/div/div[2]/div[2]/div[2]/div[2]/div[3]/div/div[5]/div/div/button[2]')))

    
btnclass = belisekarang.get_attribute("class")

while True:
    if 'disabled' in btnclass:

       driver.refresh()
    else:
        belisekarang =WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="main"]/div/div[2]/div[2]/div[2]/div[2]/div[3]/div/div[5]/div/div/button[2]')))
        belisekarang.click()

调用 driver.refrresh() 后,您的 dom 结构将被刷新,并且所有元素引用都将丢失。所以你必须再次重新识别所有元素。

所以在你的情况下,只需在再次上课之前添加“belisekarang”


推荐阅读