Сообщение: ссылка на устаревший элемент: элемент не прикреплен к документу страницы PYTHON selenium - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь получить ссылку на эпизоды с сайта. Так что мне нужно войти в ссылки и получить информацию из эпизодов для. Он работает в 2-3 эпизодах, а затем вылетает с ошибкой, которая валится внизу. Я пытался поднять время сна, но он все еще падал.

Ошибка:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

import time
import datetime
import random
import string
import json
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from urllib.request import urlopen
 
 
import urllib.request
def send_imdb(id):
    try:
        r = requests.get('http://sdarot.bnlstudio.com/import.php?id=%s' % (id))
        json = r.json()
        if json['status'] == "success":
            return json['id']
    except:
        return("Err")
 
links = []
seasons = [] 
link = "http://www.tvil.me/"

chrome_options = Options()
chrome_options.add_extension('gighmmpiobklfepjocnamgkkbiglidom.crx')

driver = webdriver.Chrome(chrome_options=chrome_options) 
driver.get(link)
#Getting Posts links and split them
page_right = driver.find_element_by_id("page-right")
posts = page_right.find_elements_by_xpath("//div[@class='index-episode-caption']/a")
for element in posts:
    href = element.get_attribute("href")
    splited = href.split("/")
    url = "%s//%s/view/%s/1/1/v/%s" % (splited[0], splited[2], splited[4], splited[8])
    links.append(url)
    ##print(url)
#Entering posts and gets IMDB ID
E = 0;
for link in links:
    driver.get(link)
    time.sleep(2)
    imdb_q = driver.find_element_by_xpath("//div[@id='view-trailer-imdb']/a")
    imdb = imdb_q.get_attribute("href")
    imdb_id = imdb.split("/")[4]
    post_id = send_imdb(imdb_id)
    print("Post_ID: %s" % (post_id))
    seasons_num = driver.find_elements_by_xpath("//*[contains(@id, 'change-season-')]/a")
    total_seasons_num = len(seasons_num)
 	
    for i in range(1, total_seasons_num):
        print("Season: %i" % (i))
        season = driver.find_element_by_css_selector("#change-season-{num} a".format(num=i))
        season.click()
        episodes = driver.find_elements_by_xpath("//*[contains(@id, 'change-episode-')]/a")
 
        for episode in episodes:
            E += 1
            print("Episode: %i" % (E))
            time.sleep(3)
            episode.click() # Break point
            time.sleep(3)

1 Ответ

0 голосов
/ 02 мая 2018

Когда элемент не присоединен к DOM, возникает исключение устаревшего элемента. Попробуйте найти элемент снова после исключения устаревшего элемента.

Попробуйте щелкнуть элемент, чтобы обновить страницу.
Пример:

 WebElement element = driver.findElement(By.Id("refreshButton"));
 element.Click(); //page will be refreshed after clicking this button
 element.Click(); //stale element exception will throw

Теперь, если вы выполните какое-либо действие (щелчок, отправка и т. Д.) Над элементом, он выдаст исключение StaleElementException, поскольку ссылка на него потеряна (страница была обновлена)

Чтобы преодолеть это, снова найдите этот элемент после обновления страницы. Как,

 WebElement element = driver.findElement(By.Id("refreshButton"));
 element.Click(); //page will be refreshed after clicking this button

 element = driver.findElement(By.Id("refreshButton"));
 element.Click();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...