Python selenium 等到 xpath 找不到的元素?
Python selenium wait until an element located not by xpath?
我在多个页面中抓取一个网页,按某些按钮会前进到下一页,但所有页面共享完全相同 url,这意味着我抓取的大多数元素在某些情况下是不可见的在单击它们之前具有相同类型的按钮,因此尝试单击它们将引发以下错误:
ElementNotInteractableException: Message: Element <div class="answer"> could not be scrolled into view
元素都是相同的class,它们都是另一个class实例的子实例,每个父class元素都有多个子实例class.
为了找到元素,我使用了两次.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 元素,那么就可以完成,尽管我不知道具体如何...
这样的事情呢(也许你需要用 contains
代替 class
):
wait.until(EC.visibility_of_element_located((By.XPATH, f'//*[@class="parent"][{index}]//*[@class="child"][{subindex}]')))
我在多个页面中抓取一个网页,按某些按钮会前进到下一页,但所有页面共享完全相同 url,这意味着我抓取的大多数元素在某些情况下是不可见的在单击它们之前具有相同类型的按钮,因此尝试单击它们将引发以下错误:
ElementNotInteractableException: Message: Element <div class="answer"> could not be scrolled into view
元素都是相同的class,它们都是另一个class实例的子实例,每个父class元素都有多个子实例class.
为了找到元素,我使用了两次.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 元素,那么就可以完成,尽管我不知道具体如何...
这样的事情呢(也许你需要用 contains
代替 class
):
wait.until(EC.visibility_of_element_located((By.XPATH, f'//*[@class="parent"][{index}]//*[@class="child"][{subindex}]')))