发现 selenium 无法定位 Vue.js 动态生成得页面元素请问有什么解决方案吗?

2023-04-10 23:01:32 +08:00
 ky1e

发现 selenium 无法定位 Vue.js 动态生成得页面元素,求教有什么解决方案吗? 连这种最简单得元素都无法获取: browser.find_element(By.XPATH, '//div[@class="phoneNumLogin"]')

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/931376

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX