Ошибка Selenium - Попробуйте / За исключением, элемент не прикреплен к странице - PullRequest
0 голосов
/ 14 октября 2019

Я делаю программу, в которой пользователь входит в свою учетную запись (выполнено на 100%), и после этого он заходит на сайт (www.site.com (не этот)) и ищет элемент. Проблема: Элемент не всегда есть, он появляется СЛУЧАЙНО, поэтому я хотел создать программу, в которой, когда он не получает капли (конфеты), он переходит на другую вкладку.

Я перепробовал много вещей,изменение циклов, добавление / удаление вещей из try, кроме etc ...

for i in range(10000):
    while True:
        print("Starting!")
        try:
            element = browser.find_element_by_xpath('//*[@id="redeem-candy-voucher"]')#.click()
        except NoSuchElementException:
            pass
        browser.execute_script("arguments[0].click();", element)

        print("Clicked Candy! Skullbux Gained!")

        time.sleep(3)

        browser.execute_script("window.open('');")
        browser.switch_to.window(browser.window_handles[1])
        browser.get("https://www.brickplanet.com/events/trick-or-treat")

        time.sleep(3)

        try:
            element = browser.find_element_by_xpath('//*[@id="redeem-candy-voucher"]')#.click()
        except NoSuchElementException:
            pass
        browser.execute_script("arguments[0].click();", element)

        print("Clicked Candy! 0.25 Gained!")
        #browser.close()
        time.sleep(5)

Возможны 2 ошибки. Когда он находит элемент, он обновляет страницу и затем выдает ошибку:

DevTools listening on ws://127.0.0.1:52479/devtools/browser/a2cfa4b3-e538-49fb-872c-114db52513ce
Starting!
Clicked Candy! Skullbux Gained!
Traceback (most recent call last):
  File "C:\Users\DOMA\Desktop\bp hack.py", line 54, in <module>
    browser.execute_script("arguments[0].click();", element)
  File "C:\Users\DOMA\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 636, in execute_script
    'args': converted_args})['value']
  File "C:\Users\DOMA\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\DOMA\AppData\Local\Programs\Python\Python36-32\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=77.0.3865.90)

И когда он вообще не находит никакого элемента:

DevTools listening on ws://127.0.0.1:52432/devtools/browser/9250b0fb-2742-4a8b-9043-b7cdbec1f8e3
Starting!
Traceback (most recent call last):
  File "C:\Users\DOMA\Desktop\bp hack.py", line 38, in <module>
    browser.execute_script("arguments[0].click();", element)
NameError: name 'element' is not defined

Process returned 1 (0x1)        execution time : 20.796 s
Press any key to continue . . .

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Обе проблемы имеют одну и ту же основную причину;когда вы вызываете это:

        try:
            element = browser.find_element_by_xpath('//*[@id="redeem-candy-voucher"]')#.click()
        except NoSuchElementException:
            pass
        browser.execute_script("arguments[0].click();", element)

Если element = browser.find_element_by_xpath('//*[@id="redeem-candy-voucher"]') не удается по какой-либо причине, то:

  • element будет либо не определен, если ваш код прошел через except route без прохождения try route.
  • или element могут ссылаться на элемент, который вы нашли в первом блоке try, но, поскольку этот элемент не присоединен к DOM, исключение StaleElementReferenceException будетподнял.

То, что вы должны сделать, чтобы избежать такого поведения, выглядит примерно так:

        try:
            element = browser.find_element_by_xpath('//*[@id="redeem-candy-voucher"]')
            browser.execute_script("arguments[0].click();", element)
        except NoSuchElementException:
            pass

0 голосов
/ 14 октября 2019

StaleElementReferenceException происходит потому, что вы обновляете страницу. Расположенный элемент не является тем же элементом после обновления страницы, поэтому вам нужно будет повторно найти этот элемент, чтобы получить новый экземпляр.

Я бы добавил wait на ваш элемент, что также должнорешите случай, когда элемент не найден:

# Wait for element to exist
element = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//*[@id='redeem-candy-voucher']")))

browser.execute_script("arguments[0].click();", element

Что касается вашей проблемы с StaleElement - если вы когда-нибудь обновите страницу, вам нужно будет повторно найти элемент. Вот пример:

# wait and find the element
element = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//*[@id='redeem-candy-voucher']")))

# refresh
driver.refresh()

# This will throw an exception!
# element.click()

# Find fresh instance of element to avoid the exception.
element = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//*[@id="redeem-candy-voucher"]")))

element.click()

Надеюсь, это немного поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...