2016-11-17 1 views
0

파이썬에서 셀레늄을 사용하여 루프를 수행하는 것과 관련된 몇 가지 질문이 있습니다. 사실, 나는 'driver.find_elements_by_id'에 의해 추적되는 링크 목록을 반복하고 하나씩 클릭하고 싶지만 문제는 링크 (코드의 '링크 목록')를 클릭 할 때마다 페이지 새로 고침되어 있으므로 '메시지 : 요소 참조가 부실임을 나타내는 오류 메시지가 표시됩니다. 요소가 더 이상 DOM에 연결되어 있지 않거나 페이지가 새로 고쳐집니다. '셀레늄 루프 페이지가 파이썬에서 새로 고침

그 이유는 클릭 후 링크 목록이 사라 졌기 때문입니다. 하지만 어떻게 페이지가 더 이상 존재하지 않더라도 셀레늄에서 일반적으로 목록을 반복 할 수 있습니다. 나는 'driver.back()'을 사용했으며 분명히 작동하지 않습니다.

오류 메시지는 코드에서이 줄 끝에서 팝업 :

link.click() 
linklist이 URL (필자는 새로 페이지 후 버튼 문서에 땡그랑 소리 다음 첫 번째 파일을 다운로드 할에 있습니다

표시됨) 'https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0001467373&type=10-K&dateb=201&owner=exclude&count=40'

누군가이 문제를 조사 할 수 있습니까? 감사합니다.

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
import unittest 
import os 
import time 
from bs4 import BeautifulSoup 
from selenium.webdriver.common.keys import Keys 
import requests 
import html2text 



class LoginTest(unittest.TestCase): 
def setUp(self): 


    self.driver=webdriver.Firefox() 
    self.driver.get("https://www.sec.gov/edgar/searchedgar/companysearch.html") 


def test_Login(self): 
    driver=self.driver 

    cikID="cik" 
    searchButtonID="cik_find" 
    typeID="//*[@id='type']" 
    priorID="prior_to" 
    cik="00001467373" 
    Type="10-K" 
    prior="201" 
    search2button="//*[@id='contentDiv']/div[2]/form/table/tbody/tr/td[6]/input[1]" 


    documentsbuttonid="documentsbutton" 
    formbuttonxpath='//a[text()="d10k.htm"]' 


    cikElement=WebDriverWait(driver,30).until(lambda driver:driver.find_element_by_id(cikID)) 

    cikElement.clear() 
    cikElement.send_keys(cik) 


    searchButtonElement=WebDriverWait(driver,20).until(lambda driver:driver.find_element_by_id(searchButtonID)) 
    searchButtonElement.click() 

    typeElement=WebDriverWait(driver,30).until(lambda driver:driver.find_element_by_xpath(typeID)) 
    typeElement.clear() 
    typeElement.send_keys(Type) 
    priorElement=WebDriverWait(driver,30).until(lambda driver:driver.find_element_by_id(priorID)) 
    priorElement.clear() 
    priorElement.send_keys(prior) 
    search2Element=WebDriverWait(driver,30).until(lambda driver:driver.find_element_by_xpath(search2button)) 
    search2Element.send_keys(Keys.SPACE) 
    time.sleep(1) 

    documentsButtonElement=WebDriverWait(driver,20).until(lambda driver:driver.find_element_by_id(documentsbuttonid)) 
    a=driver.current_url 



    window_be1 = driver.window_handles[0] 
    linklist=driver.find_elements_by_id(documentsbuttonid) 


    with open("D:/doc2/"+"a"+".txt", mode="w",errors="ignore") as newfile: 


     for link in linklist: 

       link.click()    

       formElement=WebDriverWait(driver,30).until(lambda driver:driver.find_element_by_xpath(formbuttonxpath)) 
       formElement.click() 
       time.sleep(1) 

       t=driver.current_url 

       r = requests.get(t) 
       data = r.text 

       newfile.write(html2text.html2text(data)) 

       drive.back() 
       drive.back() 


def terdown(self): 
    self.driver.quit() 
if __name__=='__main__': 
unittest.main() 
+0

하지 사용해야 할 수도 있습니다

linklist = [] for link in driver.find_elements_by_xpath('//h4[@class="title"]/a'): linklist.append(link.get_attribute('href')) 

을 그리고 당신은 링크의 목록을 반복 할 수 있습니다 :이 같은 것을보십시오 이것이 문제라면,'driver.back()'대신'for' 루프에서'drive.back()'을 사용하고 있습니다. –

답변

3

웹 요소 목록이 아니라 링크 목록을 사용해야합니다. 당신이 물리적으로 링크를 클릭합니다

for link in linklist: 
    driver.get(link) 
    # do some actions on page 

것은, 당신이

for link in linklist: 
    driver.find_element_by_xpath('//h4[@class="title"]/a[@href=%s]' % link).click() 
    # do some actions on page 
+0

안녕하세요, 고마워요! 그것은 지금 매력처럼 작동합니다! – SXC88

+0

어쩌면 당신은이 게시물 @Andersson을보고 싶습니다 ... http : //stackoverflow.com/questions/40748555/python-threading-timer-set-time-limit-when-program-runs-out-of - 시간? noredirect = 1 # comment68724872_40748555 – SXC88

관련 문제