Table des matières
2.1. Solution de moteur de recherche
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.