在浏览器返回后,在desplegable列表中查找元素

时间:2018-03-07 09:45:06

标签: selenium back expand chrome-web-driver

我正在使用以下结构抓取网页

Menu1
  Submenu1
    Event1
    Event2
    ...
  Submenu2
    Event n
    ...
  ...
Menu2
  ....

如果要访问子菜单,则必须单击“菜单”,以便展开节点并使子菜单列表可见,并且要访问“事件”列表,您需要单击相应的子菜单节点。 一旦你收到活动,你点击它就会转到另一个页面。刮掉一些之后,你会回到上一页并刮掉下一个事件。代码如下

browser=webdriver.Chrome()
browser.get(url)

Menu1=browser.find_element_by_xpath('some expression')
Menu1.click()

submenu=Menu1.find_elements_by_xpath('some other expression')
for sub in submenu:
   event=sub.find_elements_by_xpath('expression here')
   for ev in event:
     event.click()
     Some scraping
     'Go back to previous page'
     browser.execute_script("window.history.go(-1)")

在尝试为Event2执行第二次迭代后,我得到NoSuchElementException,主要是因为在返回列表之后没有展开,因此并不是所有对象都可见以继续使用for循环。

有什么方法可以解决这个问题吗?我的猜测是,如果我再次点击Menu1,所有子菜单元素都将可见,以便列表再次可用。之后,如果我点击sub,那么事件列表也将可用。

渴望阅读您的建议 感谢

1 个答案:

答案 0 :(得分:0)

所以,实际上,我想到的是解决方案是为每个菜单生成几个列表,以及节点的文本。迭代for循环而不是节点,不变的节点名称的循环。 然后,对于每个节点名称,循环遍历该对象直到找到它,然后单击该特定项目。

然后重复,直到您到达所有节点。