首页 > 其他分享 >Selenium 4 的用法

Selenium 4 的用法

时间:2024-08-07 16:51:59浏览次数:11  
标签:service perform Selenium driver element ActionChains 用法 find

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11)Mozilla 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在使用过程中常见的一些坑,以及官方所推荐使用的方式

标签:service,perform,Selenium,driver,element,ActionChains,用法,find
From: https://www.cnblogs.com/shclbear/p/18347373

相关文章

  • c# net6创建API项目 日志管理log4net的用法
    一、program.cs//配置log4netXmlConfigurator.Configure(newFileInfo("log4net.config"));二、公共类LogHelper.csnamespaceElecInvoice.Common{publicclassLogHelper{publicstaticreadonlylog4net.ILogloginfo=log4net.LogManage......
  • 很多朋友对 ABAP 关键字 FINAL 的用法,只掌握了一半
    本文阅读目录FINAL对ABAP类和方法意味着什么什么是变量的Up-front声明方式什么是变量的Inline声明方式ABAP757对变量内联声明方式的进一步增强笔者把之前的文章 SAP某ABAP系统标准类中仅有5.4%公有属性被READ-ONLY修饰,原因竟然是…… 分享到我的SAP技......
  • 猫头虎分享 Python 知识点:pandas--info()函数用法
    ......
  • Javascript——NaN有什么用法
    简介在JavaScript中,NaN(NotaNumber)是一个特殊的值,用来表示非数字的结果,例如一个不合法的数学运算的结果。根据IEEE754浮点数标准,NaN不等于任何值,包括它自己。这意味着NaN是唯一一个与自身不相等的值,所以表达式NaN===NaN返回false。判断NaN如果你需要检测一......
  • 【深入剖析】Spring依赖注入的最佳实践(@Autowired的正确用法)
    文章目录为什么Spring不推荐使用@Autowired进行字段注入?字段注入的使用与弊端1.不可见的依赖关系2.无法使用final修饰符3.测试不便推荐的替代方案1.构造器注入构造器注入的优势包括2.设值注入设值注入的优势包括总结为什么Spring不推荐使用@Autowired进行字......
  • 笠鬼bug的用法及注意事项是什么?小白也能懂!笠鬼风灵月影修改器快速启动三步秘籍
    在《笠鬼》这款游戏中,通常提到的“bug”是指游戏程序中的错误或漏洞,它们可能允许玩家以非预期的方式获得优势或绕过游戏的正常机制。然而,玩家通常不会主动“使用”bug,因为这样做可能违反游戏的服务条款,并可能导致账号被封禁。不过,从另一个角度来看,玩家可能会寻找或使用游戏修......
  • 如何在selenium python中访问电子邮件中的所有文件夹
    我使用imaplib库,但有时无法访问某些帐户,我使用poplib但它只支持访问主邮箱,但不支持访问其他文件夹,如垃圾邮件我想使用imaplib,但不会出现有时甚至无法访问的错误尽管我有一个帐户,但我仍然可以访问它,或者是否有另一个库可以快速支持该帐户?你想要使用Selenium和Python......
  • selenium webdriver出现Element is not currently visible and so may not be interac
    问题分析可能是没有加载完成,元素找不到。元素加载完成,但是元素需要点击按钮,才会触发元素插入进来元素加载完成,看到的值和实际后台传输的值是不一致的元素加载完成,本质是只有属性,是没有值的。看到的都是临时函数调用显示出来的解决方案针对第一种可以适当延长休眠时间来......
  • selenium的应用
    前言在工作中,遇到了指纹认证很强,hook等逆向的性价比不高的时候。一般我会考虑使用使用selenium一般我们会默认安装selenium,但是很多机构都会禁止掉selenium。这个时候就建议使用undetected-chromedriver安装和使用pipinstallundetected_chromedriverimportundetected_c......
  • selenium复习之---原理+基础用法
    简介1.是什么selenium是用来进行页面元素定位的第三方库,用来进行web自动化测试的工具,可以直接运行在浏览器中。2.原理:selenium在工作过程中有三个角色,selenium客户端、webdriver和浏览器selenium客户端是开发者与selenium的交互接口,它会发送指令给webdriver浏览器则接收来自......