我正在制作一些站点地图/树(使用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))