LOADING

加载过慢请开启缓存 浏览器默认开启

基于PyWebview与Selenium的智慧树脚本系统开发日志(一)—— 修复selenium抓取不到元素src属性的bug

2024/6/24 智慧树脚本 智慧树脚本 selenium 该文总阅读量

基于PyWebview与Selenium的智慧树脚本系统踩坑开发日志(一)—— 修复selenium抓取不到元素src属性的bug

笔者后续的代码为个人封装的selenium工具库,我自己用着挺顺手的,开源在个人仓库中https://github.com/666cy666/Selenium_Util

selenium抓取不到元素src属性

image-20240623200131933

yidun_broken_url = edge_driver.get_element_attribute(xpath_kind=By.CLASS_NAME,xpath='yidun_jigsaw',attribute="src")
yidun_bg_img_url,yidun_broken_url

在使用jupyter测试代码的时候十分顺利,毕竟是从老项目移植过来的,但是移植到pywebview上面抓取元素的时候一直抓不到,元素始终返回None,经多方查证在stackoverflow(python - Getting src from element using selenium - Stack Overflow)找到详细解决方案:

  • Using your method, I’ve ran into another problem. It possible to call EC.visibility_of_element_located without the @alt parameter? Can I get the src by just using the class name?

  • Charles Zhang

  • I just used the absolute xpath instead of “//img[@class=’irc_mi’ and @alt=’Image result for snowman’]” and it works now. Great!

    Charles Zhang

    CommentedJul 9, 2019 at 4:40

通过上面的信息分析,碰到类似的问题多半能经过下面的方法解决

下面是能成功抓取到的代码

print(WebDriverWait(edge_driver.driver, 20).until(EC.visibility_of_element_located(
            (By.XPATH, "//img[@class='yidun_jigsaw' and @alt='验证码滑块']"))).get_attribute("src"))

修改xpath解决方案

上面提到修改xpath为://img[@class='irc_mi' and @alt='Image result for snowman']即可,笔者也按照页面元素调整:

yidun_bg_img_url=edge_driver.get_element_attribute(xpath="//img[@class='yidun_jigsaw' and @alt='验证码滑块'",attribute="src")

解决方案:
只要将xpath改为能够唯一标识此元素路径即可,比如这里的alt属性

解决完毕!下面是问题可能出现的原因:

image-20240623201155305

如上图所示,笔者猜测页面中应该有一个非显示的元素与被抓取元素重名(我在全局搜索中发现在css样式引入的过程中确实有重名的部分),有可能是抓到引入css样式去了(我甚至觉得更有可能是selenium的bug,等日后有机会拆开内核看看)

修改等待方案(推荐!)

之前的等待方案(presence_of_element_located)

element = WebDriverWait(father_element, timeout).until(
                        EC.presence_of_element_located((xpath_kind, xpath))
                    )

presence_of_element_located是用来确认元素是否已被加载到 DOM 中

修改后的等待方案(visibility_of_element_located)

element = WebDriverWait(father_element, timeout).until(
                        EC.visibility_of_element_located((xpath_kind, xpath))
                    )

visibility_of_element_located 方法比 presence_of_element_located 更严格,它确保元素不仅存在于 DOM 中,而且必须对用户可见。

两种方法各有利弊,有时候有些元素对用户不可见的时候就需要用加载dom中的抓取方法,笔者写的工具类中默认使用presence_of_element_located