2017-08-14 48 views
3

我已經用python編寫了一個腳本,使用selenium遍歷不同的頁面,從第一頁開始通過分頁。但是,除了一些數字之外,沒有用於下一頁按鈕的選項。當我點擊該號碼時,它會將我帶到下一頁。無論如何,當我試圖用我的腳本來做到這一點,它確實點擊第二頁,並去那裏,但它不再滑動,我的意思是,而不是去到第三頁,它打破了拋出以下錯誤。不能移動到下一頁

line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document 

腳本我試圖用:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.Chrome() 
driver.get("http://www.cptu.gov.bd/AwardNotices.aspx") 
wait = WebDriverWait(driver, 10) 
driver.find_element_by_id("imgbtnSearch").click() 
for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#dgAwards > tbody > tr > td > a"))): 
    item.click() 
driver.quit() 

元素在其中分頁號碼爲:

<tr align="right" valign="top" style="font-size:XX-Small;font-weight:normal;white-space:nowrap;"> 
     <td colspan="8"><span>Page: </span><a href="javascript:__doPostBack('dgAwards$ctl01$ctl01','')">1</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl02','')">2</a>&nbsp;<span>3</span>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl04','')">4</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl05','')">5</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl06','')">6</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl07','')">7</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl08','')">8</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl09','')">9</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl10','')">10</a>&nbsp;<a href="javascript:__doPostBack('dgAwards$ctl01$ctl11','')">...</a></td> 
    </tr> 

順便說一句,分頁選項出現在點擊中的 「搜索」 按鈕主頁。

+0

'wait.until'不返回元素。你需要使用'find_element(s)'方法 – Amit

+0

我首先嚐試了這個方法,但是這也沒有帶來任何幫助。 – SIM

+0

你在哪裏得到異常 – Amit

回答

3

因爲你犯了一個click()頁面刷新和這些元素變得陳舊

您可以在下面嘗試後,無法通過預先定義的元素的列表迭代:

from selenium.common.exceptions import NoSuchElementException  

page_counter = 2 
while True: 
    try: 
     if not page_counter % 10 == 1: 
      driver.find_element_by_link_text(str(page_counter)).click() 
      page_counter += 1 
     else: 
      driver.find_elements_by_link_text("...")[-1].click() 
      page_counter += 1 
    except NoSuchElementException : 
     break 

這應該允許你切換儘管有可能,但到下一頁

+0

你是嚮導先生,Andersson。這是我見過的最好的技術。 – SIM

+0

有一件事先生 - 爲什麼百分比「page_counter%10」?原諒我的無知。 – SIM

+1

在這個內容中,它不是*百分比*,而是[* modulo *](https://stackoverflow.com/questions/12754680/modulo-operator-in-python)。 'page_counter%10 == 1'表示返回等於'10 + 1'('11'),'20 + 1'('21'),'30 + 1'('31')的'page_counter'。 ..這是因爲,而不是與文本'11','21','31'的鏈接...有'...'的鏈接 – Andersson