• 升级 selenium4 后,坑了


    最近 selenium 进行了一个更新,我毫不犹豫的升级了,没想到直接掉坑里了。

    我之前的 selenium 版本是 3.14.0,在 Python 升级 selenium 很简单,只需要一行命令就可以搞定。

     pip install -U selenium

    升级完成之后,可以通过 pip show selenium 查看最新版本是 4.1.0。

    接下来,我把之前的自动化测试代码拿出来,重新用新的 selenium 版本运行一下。代码很简单,就是在百度主页搜索了"python"几个字。

     from selenium import webdriver
     
     def test_01():
         with webdriver.Chrome() as browser:
             browser.get("http://www.baidu.com")
             input_el = browser.find_element(By.XPATH, '//input[@id="kw"]')
             input_el.send_keys('python')

    坑来了,直接报错。同一份代码,在 selenium3 中完美运行。升级到 selenium4 之后,虽然元素能正常找到,但是调用 send_keys 方法,会报错,报错信息为 dict 没有 send_keys 方法。也就是说,find_element 方法返回的是一个字典对象,不是官方定义的 WebElement 对象。

    直接打印 input_el,得到的真的是一个字典:

     {'ELEMENT': '0.5678200594548724-1'}

    查看 find_element 方法的源码注释,确实是 WebElement 对象,官方说明和实际运行结果不匹配。

    盲猜是驱动不兼容导致的,下载最新的 chromedriver 驱动,保存到本地,在初始化浏览器对象时指定驱动路径:

     webdriver.Chrome(executable_path='chromedriver_95.exe')

    程序果然正常运行了,但是报了一个警告信息。

    翻译一下:Chrome 类中的 executable_path 参数在最新的 selenium4 中已经被移除了,需要传入 Service 对象。

    修改后的代码就是正确的打开方式了:

     def test_01():
         service = Service(executable_path='chromedriver_95.exe')
         with webdriver.Chrome(service=service) as browser:
             browser.get("http://www.baidu.com")
             input_el = browser.find_element(By.XPATH, '//input[@id="kw"]')
             input_el.send_keys('python')

    之前的 selenium, 在 Chrome 类中同时管理 Service 类和 Connection 客户端类。 更新之后,service 提取出去,Chrome 类的职责单一了,结构更加清晰。

     
  • 相关阅读:
    [独库骑行之行路难]行路难!
    [独库骑行之我们穿过草原]巴音布鲁克大草原
    [独库骑行之我们路过湖泊]天山的高山湖泊
    [Tips]通过retintolibc方法编写通用exp的一个小技巧
    [独库骑行之奇山异石]丹霞地貌和雅丹地貌
    [独库骑行之我们穿过草原]美丽的乔尔玛草原
    [独库骑行之我们路过沙漠]塔克拉玛干的边缘
    [独库骑行之我们路过森林]那拉提的山林
    大家新年快乐!
    记忆力衰退
  • 原文地址:https://www.cnblogs.com/pywen/p/15767982.html
Copyright © 2020-2023  润新知