2017-06-19 89 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

我懂了,感谢您的帮助! –

相关问题