2017-06-19 88 views
1

我的工作(使用anytree),爲了做到這一點使網站地圖/有些樹的點擊,我需要硒找到一個特定元素頁面(代表類別),然後系統地點擊這些元素,在每個新頁面上尋找新的類別,直到我們沒有再打入類別,即。所有的樹葉和樹木都被填滿。如何使用Selenium通過多個元素,同時避免陳舊的元素錯誤

我有很多的這個已經寫入。嘗試遍歷我的元素列表時出現了我的問題。我目前嘗試填充樹深度優先,下到樹葉,然後彈出回到原來的頁面,繼續與列表中的下一個元素相同的東西。但是,這會導致Stale element reference錯誤,因爲我的頁面會重新加載。什麼是解決這個問題的方法?我可以以某種方式在新窗口中打開新鏈接,以便保留舊頁面?我發現這個異常的唯一修復是整齊地捕捉它,但是這對我沒有幫助。

這裏是我到目前爲止的代碼(問題在於for循環):

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 
from anytree import Node, RenderTree 

def findnodes(driver) : 
    driver.implicitly_wait(5) 
    try: 
     nodes = driver.find_elements_by_css_selector('h3.ng-binding') 
    except: 
     nodes = [] 
    return nodes 

def populateTree(driver, par) : 

    url = driver.current_url 
    pages = findnodes(driver) 
    if len(pages)>0 : 
     for page in pages: 
      print(page.text) 
      Node(page.text, parent=par) 
      page.click() 
      populateTree(driver, page.text) 
      driver.get(url) 

driver = webdriver.Chrome() 
#Get starting page 
main ='http://www.example.com' 
root = Node(main) 
driver.get(main) 

populateTree(driver, root) 

for pre, fill, node in RenderTree(root): 
    print("%s%s" % (pre, node.name)) 

回答

0

我沒有在Python的工作,但有關於Java /硒工作。但是,我可以給你克服陳舊的想法。

一般我們會得到陳舊但如果該元素的屬性或東西正在啓動webelement後改變。例如,在某些情況下,如果用戶嘗試單擊同一頁面上的同一元素,但在頁面刷新後,則會得到staleelement異常。

爲了克服這一點,我們可以當頁面被更改或刷新的情況下,創造了新鮮webelement。 。下面的代碼可以給你一些想法(這是在Java,但這個概念將是相同的)

例子:

webElement element = driver.findElement(by.xpath("//*[@id='StackOverflow']")); 
element.click(); 
//page is refreshed 
element.click();//This will obviously throw stale exception 

爲了克服這一點,我們可以在XPath的存儲一些字符串,並使用它創建我們走的時候一個新的webelement。

String xpath = "//*[@id='StackOverflow']"; 
driver.findElement(by.xpath(xpath)).click(); 
//page has been refreshed. Now create a new element and work on it 
driver.fineElement(by.xpath(xpath)).click(); //This works 

希望這有助於你。謝謝。

+0

感謝您的幫助,即使它不是你的語言!我很感激。我明白爲什麼我會得到陳舊的錯誤,但是我找到了一個元素列表並試圖遍歷它們,因爲您的示例只是重新提煉特定元素(如果我正在閱讀它的話)。如果你有一份要經歷的內容清單,那麼你怎麼能夠避免這種情況發生呢? –

+0

再次使用xpath重新構建元素列表。 –

+0

我懂了,感謝您的幫助! –

相關問題