2016-11-17 16 views
0

PythonのSeleniumでループを実行することに関連するいくつかの質問があります。実際、私は 'driver.find_elements_by_id'で追跡されたリンクのリストを繰り返し、それらを一つずつクリックしたいのですが、問題は、リンク(コード内のリンクリスト)をクリックするたびに、がリフレッシュされ、 'メッセージ:要素の参照が古くなっていることを示すエラーメッセージが表示されます。要素がDOMに接続されていないか、ページがリフレッシュされています。セレンのループページをPythonでリフレッシュ

リンクのリストがクリック後に消えてしまったためです。しかし、どのように私は一般的にセレンでは、ページがもう存在しなくてもリストを繰り返すことができます。私は '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

ないを使用する必要がありますリンク

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

のリストを反復することができますこれが問題であるかどうかは確かですが、 'driver.back() 'の代わりに' for'ループで 'drive.back()'を使用しています –

答えて

3

ウェブ要素のリストではなく、リンクのリストを使用してください。このような何か試してみてください:

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

をそして、あなたは、物理的に各リンクをクリックする場合は、

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 -time?noredirect = 1#comment68724872_40748555 – SXC88

関連する問題