发现 selenium 无法定位 Vue.js 动态生成得页面元素,求教有什么解决方案吗? 连这种最简单得元素都无法获取: browser.find_element(By.XPATH, '//div[@class="phoneNumLogin"]')
1
ClericPy 2023-04-10 23:33:38 +08:00
试试 JS 能定位么, 有时候因为内嵌 iframe 了得在内层 node 上运行 JS? 瞎猜的~ 早就不用 selenium 了
|
2
renmu 2023-04-10 23:58:21 +08:00 via Android
我记得 selenium 就是个无头浏览器,你加载完页面后 sleep 一段时间,等 js 加载完再处理,我记得有个什么 wait 的参数
|
3
MHPSY 2023-04-11 08:28:46 +08:00
先去试一下正常的浏览器能不能用 document byId 获取到 (我怀疑是拼写错误)
|
4
kanchi240 2023-04-11 08:49:59 +08:00
报什么错呢,F12 把 xpath 贴进去看能找到吗
|
5
lyhapple 2023-04-11 09:00:24 +08:00
动态生成的内容需要等待内容生成出来, 在 DOM 树里有对象才行,这样做:
|
6
lyhapple 2023-04-11 09:03:37 +08:00 1
手快了,按错了,这样做:
from selenium.webdriver.support.ui import WebDriverWait WAIT_SEC = 60 // 秒 wait = WebDriverWait(browser, WAIT_SEC) locator = (By.CSS_SELECTOR, "div.phoneNumLogin") if wait.until(EC.visibility_of_element_located(locator)): div = browser.find_element(*locator) // 继续你的逻辑 重点在于 WebDriverWait |
7
lyhapple 2023-04-11 09:04:05 +08:00
晕, 缩进被自动干掉了。。
|
8
evil0harry 2023-04-11 10:19:15 +08:00
@lyhapple 编辑器对游标卡尺语言不太友好
|
9
yjfkk 2023-04-11 18:35:06 +08:00 via iPhone
selenium 无法感知到动态 dom 的加载过程,selenium 以为渲染结束了,其实没结束,解决办法:
1.暴力 sleep 几秒等控件出现 2.wait_for 方法等待元素出现。 |
10
pppguest3962 2023-04-23 23:40:17 +08:00 via iPhone
那么多年了,selenium 会不会出现有新时代的替代品了?
以前写过几个爬虫,想省事就绕不开这个了,这个东西在我代码逻辑上,尤其在多线程的时候,一些环节上的实现,页面会莫名其妙的要等很久(内存和核数也分配的足够),最烦要 wait ,wait 可靠性也不高,渲染效率也不怎么样,还真不如花更多的时间去琢磨 js 引用数据算法,逆向它的实现原理,直接取数据而不等渲染出具体的 DOM 节点目标… |