【Python爬虫】selenium4新版本使用指南-CSDN博客

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中就像真正的用户在操作一样。支持的浏览器包括IE7, 8, 9, 10, 11Mozilla FirefoxSafariGoogle ChromeOperaEdge等。这个工具的主要功能包括测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。

    随着时代的发展在使用python做自动化时与之前差生了很大的变化这些变化都是一个老程序员所必须要踩坑的地方也是由于已经会了老版本在使用新版本的时候需要多次探索本文从当前最新版的Selenium出发以Chrome驱动为例总结了新版的使用方法免得到处去搜索、踩坑。

    01、设置驱动

    当前Selenium版本4.3.0请核对你的版本是否是4.0以上的版本

    注意
    请查看你的浏览器版本然后再去下载对应的驱动通常来说版本号时一致的如果没有你的版本号那就选择和你浏览器版本号最相近的版本。

    1. selenium4推荐方法

    由于传统的设置驱动方式过于繁琐因此GitHub大佬SergeyPirogov写了浏览器驱动管理器可以使设置驱动变得更加方便。

    首先需要安装该管理器使用以下命令

    pip install webdriver-manager

    然后导入该包

    from webdriver_manager.chrome import ChromeDriverManager

    设置service通过ChromeDriverManager().install()来获取驱动从而省去了下载驱动和设置驱动的步骤

    service = ChromeService(executable_path=ChromeDriverManager().install())

    然后驱动加载该service

    driver = webdriver.Chrome(service=service)

    此处贴出完整代码以供参考

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service as ChromeService
    from webdriver_manager.chrome import ChromeDriverManager
    service = ChromeService(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    driver.quit()

    2. 传统方法

    这里使用传统方法来设置Selenium的驱动也就是导入webdriver然后设置可执行程序的路径。

    首先在Selenium4中设置驱动位置不再是直接在webdriver.Chrome中直接设置而是引入了Service。

    因此先导入Service的包

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service as ChromeService

    然后通过Service设置驱动CHROMEDRIVER_PATH替换为你的驱动位置

    service = ChromeService(executable_path=CHROMEDRIVER_PATH)

    最后在webdriver.Chrome中调用这个service

    driver = webdriver.Chrome(service=service)

    给出完整代码予以参考

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service as ChromeService
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)
    service = ChromeService(executable_path=CHROMEDRIVER_PATH)
    driver = webdriver.Chrome(service=service, options=options)

    02、查找元素

    在selenium4中一系列的findElement方法如findElementByClassNamefindElementById等都被整合成为了一个方法——findElement。并且通过By.method来选择你的查找元素方法例如下。

    如果你想根据类名查找元素你可以使用以下方法

    driver.findElement(By.className("className"));

    如果你想通过css选择器来查找元素你可以使用以下方法

    driver.findElement(By.cssSelector(".className"));

    这里贴出与以往对应的所有查找元素方法更新前

    driver.findElementByClassName("className");
    
    driver.findElementByCssSelector(".className");
    driver.findElementById("elementId");
    driver.findElementByLinkText("linkText");
    driver.findElementByName("elementName");
    driver.findElementByPartialLinkText("partialText");
    driver.findElementByTagName("elementTagName");
    driver.findElementByXPath("xPath");

    更新后

    driver.find_element(By.XPATH,'XPATH')
    driver.find_element(By.CLASS_NAME,'CLASS_NAME')
    driver.find_element(By.CSS_SELECTOR,'CSS_SELECTOR')
    driver.find_element(By.ID,'ID')
    driver.find_element(By.LINK_TEXT,'LINK_TEXT')
    driver.find_element(By.PARTIAL_LINK_TEXT,'PARTIAL_LINK_TEXT')
    driver.find_element(By.TAG_NAME,'TAG_NAME')

    如果你查找的是多个元素只需要将其中的find_element替换成find_elements即可。

    等待元素出现

    有时候某个元素不是直接出现的如果不做判断则会导致程序崩溃因此一般可以做异常处理这里还有等待元素出现的方法。

    首先需要导入等待的包

    from selenium.webdriver.support.ui import WebDriverWait

    然后使用以下方法等待元素出现driver就是浏览器驱动timeout就是等待的时长until后是判断元素是否出现的

    el = WebDriverWait(driver, timeout=3).until(lambda d: d.find_element_by_tag_name("p"))

    03、动作API

    动作API是网上资料比较少的因为之前的查找元素调用click等已经可以解决很多的问题了在翻看官方文档时发现selenium还支持动作API来模拟动作。

    动作API分为四个部分分别是键盘鼠标滚轮。这里先说明以下公共部分的。

    暂停pause

    光标移动滚轮滚动期间会有一些时间空隙这里可以使用暂停来实现这里是支持链式调用的这里贴出官方给出的例子

    clickable = driver.find_element(By.ID, "clickable")
    ActionChains(driver)\
            .move_to_element(clickable)\
            .pause(1)\
            .click_and_hold()\
            .pause(1)\
            .send_keys("abc")\
            .perform()

    释放所有动作

    当前有动作执行时可以使用以下方法停止这些动作

    ActionBuilder(driver).clear_actions()
    

    键盘

    键盘代码表

    如果你有兴趣可以看一下地址在这里可以看到完整的列表。

    按下某键以输入shift+abc为例

        ActionChains(driver)\
            .key_down(Keys.SHIFT)\
            .send_keys("abc")\
            .perform()

    弹起某键以输入shift+a和shift+b为例

        ActionChains(driver)\
            .key_down(Keys.SHIFT)\
            .send_keys("a")\
            .key_up(Keys.SHIFT)\
            .send_keys("b")\
            .perform()

    浏览器输入某串字符不指定元素

        ActionChains(driver)\
            .send_keys("abc")\
            .perform()

    指定元素输入字符串

        text_input = driver.find_element(By.ID, "textInput")
        ActionChains(driver)\
            .send_keys_to_element(text_input, "abc")\
            .perform()

    复制和粘贴

    cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
    ActionChains(driver)\
            .send_keys("Selenium!")\
            .send_keys(Keys.ARROW_LEFT)\
            .key_down(Keys.SHIFT)\
            .send_keys(Keys.ARROW_UP)\
            .key_up(Keys.SHIFT)\
            .key_down(cmd_ctrl)\
            .send_keys("xvv")\
            .key_up(cmd_ctrl)\
            .perform()

    鼠标

    鼠标点击保持该方法将鼠标移动到元素中心与按下鼠标左键相结合。

    这有助于聚焦特定元素

        clickable = driver.find_element(By.ID, "clickable")
        ActionChains(driver)\
            .click_and_hold(clickable)\
            .perform()

    鼠标点击释放

        clickable = driver.find_element(By.ID, "click")
        ActionChains(driver)\
            .click(clickable)\
            .perform()

    鼠标定义的5种按键

    • 0——鼠标左键
    • 1——鼠标中键
    • 2——鼠标右键
    • 3——X1后退键
    • 4——X2前进键

    鼠标右击

        clickable = driver.find_element(By.ID, "clickable")
        ActionChains(driver)\
            .context_click(clickable)\
            .perform()

    按下鼠标3键

        action = ActionBuilder(driver)
        action.pointer_action.pointer_down(MouseButton.BACK)
        action.pointer_action.pointer_up(MouseButton.BACK)
        action.perform()

    按下鼠标4键

        action = ActionBuilder(driver)
        action.pointer_action.pointer_down(MouseButton.FORWARD)
        action.pointer_action.pointer_up(MouseButton.FORWARD)
        action.perform()

    鼠标双击

        clickable = driver.find_element(By.ID, "clickable")
        ActionChains(driver)\
            .double_click(clickable)\
            .perform()

    鼠标移动到元素上

        hoverable = driver.find_element(By.ID, "hover")
        ActionChains(driver)\
            .move_to_element(hoverable)\
            .perform()

    鼠标位移

    就是通过像素点来进行位移操作

    从元素左顶边进行位移

        mouse_tracker = driver.find_element(By.ID, "mouse-tracker")
        ActionChains(driver)\
            .move_to_element_with_offset(mouse_tracker, 8, 11)\
            .perform()

    从元素中心进行位移请期待

    从当前窗口左上角位移

        action = ActionBuilder(driver)
        action.pointer_action.move_to_location(8, 12)
        action.perform()

    从当前鼠标位置位移

        ActionChains(driver)\
            .move_by_offset( 13, 15)\
            .perform()

    拖拽元素

    该方法首先单击并按住源元素移动到目标元素的位置然后释放鼠标。

        draggable = driver.find_element(By.ID, "draggable")
        droppable = driver.find_element(By.ID, "droppable")
        ActionChains(driver)\
            .drag_and_drop(draggable, droppable)\
            .perform()

    通过位移拖拽

        draggable = driver.find_element(By.ID, "draggable")
        start = draggable.location
        finish = driver.find_element(By.ID, "droppable").location
        ActionChains(driver)\
            .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y'])\
            .perform()

    笔部分浏览器生效

    由于笔只在部分浏览器生效这里就不写了如果你感兴趣或者有需求可以去官方文档查看这里贴出官方文档地址。

    滚轮只有谷歌内核浏览器生效

    滚动到某元素位置

    iframe = driver.find_element(By.TAG_NAME, "iframe")
    
    ActionChains(driver)\
        .scroll_to_element(iframe)\
        .perform()

    定量滚动

        footer = driver.find_element(By.TAG_NAME, "footer")
        delta_y = footer.rect['y']
        ActionChains(driver)\
            .scroll_by_amount(0, delta_y)\
            .perform()

    从一个元素滚动指定量

        iframe = driver.find_element(By.TAG_NAME, "iframe")
        scroll_origin = ScrollOrigin.from_element(iframe)
        ActionChains(driver)\
            .scroll_from_origin(scroll_origin, 0, 200)\
            .perform()

    从一个元素滚动并指定位移

        footer = driver.find_element(By.TAG_NAME, "footer")
        scroll_origin = ScrollOrigin.from_element(footer, 0, -50)
        ActionChains(driver)\
            .scroll_from_origin(scroll_origin, 0, 200)\
            .perform()

    从一个元素的原点位移

        ActionChains(driver)\
            .scroll_from_origin(scroll_origin, 0, 200)\
            .perform()

    总结

    以上就是本文的所有内容总结了selenium4在使用过程中常见的一些坑以及官方所推荐使用的方式

    最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走

    这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你 

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: python