Selenium signale une erreur lors de l'utilisation de XPATH pour extraire du contenu (résolu)

Table des matières

1. Description

1.1. Préface

1.2. Message d'erreur

1.3. Code d'erreur

2. Résoudre

2.1. Solution de moteur de recherche

2.2. Solution finale


1. Description

1.1. Préface

Contexte : lors de l'utilisation de Selenium, une erreur se produit lors de l'obtention des exigences du poste et des informations salariales à partir de la plateforme de recrutement.

Environnement : Windows 10 Édition Familiale

Langage : python 3

Module : sélénium

Problèmes qui surviennent :

selenium.common.exceptions.StaleElementReferenceException : Message : La référence de l'élément : l'élément n'est pas attaché au document de page

Cela signifie que le nœud est ancien et que les informations ne peuvent pas être trouvées à l'aide du nœud actuel. Doit-il être actualisé ?

1.2. Message d'erreur

Le message d'erreur complet est le suivant :

selenium.common.exceptions.StaleElementReferenceException : Message : La référence d'élément de <div class="item__10RTO"> est obsolète ; soit l'élément n'est plus attaché au DOM, il n'est pas dans le contexte du frame actuel, soit le document a été actualisé
Stacktrace :
RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
WebDriverError @chrome://remote/content/shared/webdriver/Errors.sys.mjs:182:5
StaleElementReferenceError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:463:5
element.resolveElement@chrome ://remote/content/marionette/element.sys.mjs:674:11
évaluer.fromJSON@chrome://remote/content/marionette/evaluate.sys.mjs:255:31
évaluer.fromJSON@chrome://remote /content/marionnette/evaluate.sys.mjs:263:29
évaluer.fromJSON@chrome://remote/content/marionette/evaluate.sys.mjs:263:29
recevoirMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.sys.mjs:74:34

1.3. Code d'erreur

 driver = Firefox()  # 创建一个浏览器对象
 driver.get("页面url")  # 访问网页
 # 访问页面后,出现登录或注册弹窗,影响下一步,所以要把弹窗关掉
 # 右键检查,选项页面元素,直接复制xpath路径
 driver.implicitly_wait(8)
 # driver.switch_to.window(driver.window_handles[-1])
 one_el = driver.find_element(By.XPATH, '//*[@id="cboxClose"]')  # 定位标签位置,一般是打叉的位置
 one_el.click()  # 点击该位置,点击打叉也就是关闭弹窗
 time.sleep(3)
 # 在文本框输入内容,先定位,在输入值,敲回车或者点击搜索
 driver.find_element(By.XPATH, '//*[@id="search_input"]').send_keys("python", Keys.ENTER)
 all_li = driver.find_elements(By.XPATH, '/html/body/div/div[2]/div/div[2]/div[3]/div/div[1]/div')
 for li in all_li:
     job_name = li.find_element(By.XPATH, './div/div/div/a').text
     job_time = li.find_element(By.XPATH, './div/div/div/span').text
     job_price = li.find_element(By.XPATH, './div/div/div[2]/span').text
     print(job_name, job_time, job_price)

2. Résoudre

2.1. Solution de moteur de recherche

1) Tout d'abord, j'ai utilisé un moteur de recherche pour rechercher le problème, et j'ai à peu près compris la raison de cette erreur (j'en parlerai plus tard). Merci aux internautes enthousiastes pour le partage ;

2) J'ai essayé d'utiliser la méthode partagée par la plupart des internautes : utilisez les structures try et except pour actualiser la page, mais j'ai constaté que la même erreur avait été signalée (un délai a été ajouté pour le moment)

Cette méthode ne fonctionne pas pour moi. . .

2.2. Solution finale

Après avoir entré le contenu de la recherche, attendez pour vous assurer que le contenu de la page peut apparaître complètement, puis actualisez (la clé est la suivante, cette actualisation met à jour le nœud), attendez pour que le contenu soit complètement chargé et que le nœud et le contenu soient obtenus à ce moment-là. temps.

le code s'affiche comme ci-dessous :

    driver = Firefox()  # 创建一个浏览器对象
    driver.get("页面url")  # 访问网页
    # 访问页面后,出现登录或注册弹窗,影响下一步,所以要把弹窗关掉
    # 右键检查,选项页面元素,直接复制xpath路径
    driver.implicitly_wait(8)
    # driver.switch_to.window(driver.window_handles[-1])
    one_el = driver.find_element(By.XPATH, '//*[@id="cboxClose"]')  # 定位标签位置,一般是打叉的位置
    one_el.click()  # 点击该位置,点击打叉也就是关闭弹窗
    time.sleep(3)
    # 在文本框输入内容,先定位,在输入值,敲回车或者点击搜索
    driver.find_element(By.XPATH, '//*[@id="search_input"]').send_keys("python", Keys.ENTER)
    time.sleep(3)  # 等待内容加载完成
    driver.refresh()  # 刷新页面,使节点刷新
    time.sleep(3)  # 等待页面加载完成,此时的节点才是正确的
    all_li = driver.find_elements(By.XPATH, '/html/body/div/div[2]/div/div[2]/div[3]/div/div[1]/div')
    # a = 1
    for li in all_li:
        job_name = li.find_element(By.XPATH, './div/div/div/a').text
        job_time = li.find_element(By.XPATH, './div/div/div/span').text
        job_price = li.find_element(By.XPATH, './div/div/div[2]/span').text
        print(job_name, job_time, job_price)

Les résultats sont présentés dans la figure 1 :

 Figure 1

Le programme peut s’exécuter, mais je n’ai plus besoin de l’exécuter.

Je suppose que tu aimes

Origine blog.csdn.net/qq_57663276/article/details/128495490
conseillé
Classement