StaleElementReferenceException Использование Selenium в Python - PullRequest
1 голос
/ 06 февраля 2020

Да, я знаю, что на этот тип вопросов уже давали ответы много раз, но никто из них не помог мне. На самом деле я мало что знал об этом, поэтому мне нужна ваша помощь!

Моя проблема: Я просматриваю веб-сайт, и мне нужна CAPTCHA для поиска каждого ввода. Поэтому я использую FireFox в качестве браузера, так как он запрашивает капчу один раз и не меняет ее. Мой код запрашивает у пользователя CAPTCHA один раз, затем нажимает кнопку поиска и пытается очистить данные, но когда он нажимает кнопку поиска снова (как в al oop), то возникает эта ошибка 1008 *:

selenium.common.exceptions.StaleElementReferenceException: 
Message: The element reference of <input id="txt_ALPHA_NUMERIC" class="ui-inputfield ui-inputtext ui-widget ui-state-default ui-corner-all" name="txt_ALPHA_NUMERIC" type="text"> is stale; 
either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

Мой старый код:

from selenium import webdriver                    # Import module 
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys   # For keyboard keys 
import time    
import pandas as pd

URL = 'https://vahan.nic.in/nrservices/faces/user/searchstatus.xhtml'      # Define URL 
browser = webdriver.Firefox(executable_path=r'C:\Users\intel\Downloads\Setups\geckodriver.exe')  

browser.get(URL)

vehicle_no = browser.find_element_by_xpath("""//*[@id="regn_no1_exact"]""")
vehicle_no.send_keys('RJ14CX3238')

captcha_input = input("enter your captcha ")
captcha = browser.find_element_by_xpath("""//*[@id="txt_ALPHA_NUMERIC"]""")
captcha.send_keys(captcha_input)
button_click = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[5]/div/button/span").click()    

i = 111
attempt = 1
max_attempts = 2
while True: 
    i = i + 1
    time.sleep(4)
    reg_no = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[6]/div/div/div/table/tbody/tr[2]/td[2]/span").text
    date = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[6]/div/div/div/table/tbody/tr[2]/td[4]").text 

    vehicle_no = browser.find_element_by_xpath("""//*[@id="regn_no1_exact"]""")
    vehicle_no.send_keys('RJ14CX3' + str(i))

    captcha.send_keys(captcha_input)

    button_click = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[5]/div/button/span").click()    
    browser.execute_script("return arguments[0].scrollIntoView(true);", button_click)

Обновлен новый код:

from selenium import webdriver                    # Import module 
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys   # For keyboard keys 
import time    
import pandas as pd
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

URL = 'https://vahan.nic.in/nrservices/faces/user/searchstatus.xhtml'      # Define URL 
browser = webdriver.Firefox(executable_path=r'C:\Users\intel\Downloads\Setups\geckodriver.exe')  

browser.get(URL)

vehicle_no = browser.find_element_by_xpath("""//*[@id="regn_no1_exact"]""")
vehicle_no.send_keys('RJ14CX3238')

captcha_input = input("enter your captcha ")
captcha = browser.find_element_by_xpath("""//*[@id="txt_ALPHA_NUMERIC"]""")
captcha.send_keys(captcha_input)
button_click = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[5]/div/button/span").click()    

i = 111
while True: 
    button_click = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[5]/div/button/span")
    WebDriverWait(browser, 10).until_not(EC.visibility_of_element_located((By.ID, "overley")))
    browser.execute_script("return arguments[0].scrollIntoView(true);", button_click)

    i = i + 1
    #reg_no = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[6]/div/div/div/table/tbody/tr[2]/td[2]/span").text
    #date = browser.find_element_by_xpath("/html/body/form/div[1]/div[3]/div/div[2]/div/div/div[2]/div[6]/div/div/div/table/tbody/tr[2]/td[4]").text 
    time.sleep(5)
    vehicle_no.send_keys('RJ14CX3' + str(i))
    WebDriverWait(browser, 10).until_not(EC.visibility_of_element_located((By.ID, "overley")))
    captcha.send_keys(captcha_input)

Также исправьте любые другие проблемы, если есть в моем коде. Буду признателен за любую помощь! ! Заранее спасибо.

1 Ответ

1 голос
/ 06 февраля 2020

Просто заново найдите элемент кнопки в l oop каждый раз, а не до того, как запустится l oop. Каждый раз, когда DOM видоизменяется, предыдущие ссылки помечаются как устаревшие и требуют нового экземпляра. Взаимодействуя с Captcha, измените DOM и пометьте страницу как грязную (изменившуюся / модифицированную), которую Selenium использует для пометки «устаревания».

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