【发布时间】:2023-03-30 14:25:01
【问题描述】:
我在多个页面中抓取网页,按某些按钮将前进到下一页,但所有页面共享完全相同的 url,这意味着我抓取的大多数元素在之前的某些相同类型的按钮之前不可见它们被单击,因此尝试单击它们会引发以下错误:
ElementNotInteractableException: Message: Element <div class="answer"> could not be scrolled into view
元素都是同一个类,都是另一个类的实例的子类,每个父类都有多个子类的实例。
为了查找元素,我使用了两次.find_elements_by_class_name() 方法:
lists = []
for i in Firefox.find_elements_by_class_name('parent'):
lists.append(i.find_elements_by_class_name('child')
每个子列表中只有一个元素需要点击,该元素由其属性确定并使用列表索引标识,所以我完全不知道它的 xpath 是什么。
在单击前一个元素之前,每个元素都不可见,因此必须等待它们以避免ElementNotInteractableException。
我正在使用以下语法:
wait = WebDriverWait(Firefox, 3)
wait.until(EC.visibility_of_element_located((By.XPATH, xpath)))
我需要找到使用上述方法定位的元素的 xpath,不幸的是 Selenium 本身不支持这个。
但我发现了一个窍门here:
In [1]: el
Out[1]: <Element span at 0x109187f50>
In [2]: el.getroottree().getpath(el)
Out[2]: '/html/body/div/table[2]/tbody/tr[1]/td[3]/table[2]/tbody/tr/td[1]/p[4]/span'
所以我认为,如果我可以从 selenium 页面源构建 lxml 树,然后以某种方式将 selenium 元素转换为 lxml 元素,那么它可以完成,虽然我不知道具体如何......
【问题讨论】:
标签: python python-3.x selenium xpath lxml