草庐IT

Selenium.Webdriver最新语法教程(附Chrome实例演示)

是羽十八ya 2023-04-04 原文

 “ 随着selenium库的不断更新,现有教程部分语法不适用于当前版本,故笔者写下此篇教程供初学者学习使用、老手快速查询调库使用 。” 

  • 编程环境:Pycharm
  • 浏览器:Chrome
  • 示例网站:www.baidu.com
  • 教程内容:Selenium.Webdriver语法、ActionChains库语法、Keys库列表
  • Selenium.Webdriver:模拟浏览器行为
  • ActionChains库:模拟键盘、模拟鼠标行为
  • Keys库列表:模拟按键对应字符串对照列表
  • 根据需求按照目录自由跳转学习即可

 驱动下载与导入

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

s = Service(r'F:\Download\Browser\Edge\chromedriver.exe')  # 存储驱动所在路径
d = webdriver.Chrome(service=s)  # 从路径提取驱动,设置驱动名为d
d.implicitly_wait(60)  # 设置每个步骤最大等待时间
d.get('https://www.baidu.com')  # GET方法访问百度

Selenium八大定位语法

  • Tips :快速获取网页元素标识内容,步骤:点击网页元素-右键-检查
  • Tips :css\xpath标识内容可通过浏览器快速获取,步骤:选择元素源代码-右键-copy-导出
d.find_element('id', 'id标识内容')
d.find_element('css selector', 'css标识内容').send_keys()

d.find_element('link text', '文本标识内容')
d.find_element('partial link text', '部分文本标识内容')

d.find_element('name', 'name标识内容')
d.find_element('class name', 'class标识内容')
d.find_element('tag name', 'tag name标识内容')
d.find_element('xpath', 'xpath标识内容')

# 常结合输入框输入参数,更多语法详见下文:ActionChains库
d.find_element('id', '输入框的id').send_keys('输入框的输入内容')

网页操作

基本操作

d.implicitly_wait('秒数')     # 设置最大等待时间
d.implicitly_wait(60)    # 设置最大等待时间为60秒

d.refresh()     # 刷新当前窗口
d.forward()    # 网页前进
d.back()   # 网页后退

d.maximize_window()     # 最大化当前驱动窗口
d.minimize_window()     # 最小化当前驱动窗口
d.fullscreen_window()  # 网页全屏,调用窗口管理器特定的“全屏”操作


d.get_cookie('name的名称')     # 通过name获得一个cookie
d.get_cookies()     # 返回对应于当前会话可见的所有cookies,返回类型为字典

d.start_client()    # 自定义开启会话,创建新session前调用
d.stop_client()  # 自定义结束会话,结束一个session后调用
# d.start_session('字典:支撑会话功能的字典')

自动截屏

d.get_screenshot_as_file('filename')    # 当前页面截屏保存为png图片,可指定路径,bool
d.get_screenshot_as_file('r"/figure/sc.png')    # 文件名后缀png不能少
d.get_screenshot_as_png()   # 当前页面截屏保存为png格式,数据形式为binary data

窗口参数获取与设置

# get 为获取,set为设置
d.get_window_rect()     # 当前窗口x,y坐标和长度、宽度
d.get_window_position()     # 当前窗口x、y坐标
d.get_window_size()     # 当前窗口长度、宽度

d.set_window_rect('x坐标', 'y坐标', '宽度', '高度')
d.set_window_position('x坐标', 'y坐标', windowHandle='current')
d.set_window_size('宽度', '高度', windowHandle='current')

窗口切换与变量获取

# 工作窗口、frame等切换:swith_to
d.switch_to.default_content()    # 切换到默认页
d.switch_to.frame('frame_name')    # 切换到指定frame
d.switch_to.parent_frame()    # 切换到父frame
d.switch_to.window('main')    # 切换到主窗口

# 保存操作,需要赋予变量存储
source = d.page_source      # 保存当前页面的源
title = d.title     # 保存当前页面title
handlers = d.current_window_handle      # 保存所有窗口句柄
handler = d.current_window_handle       # 保存当前窗口句柄
outs = d.timeouts   # 保存当前页面所有超时

# swith_to 和保存操作结合
element = d.switch_to.active_element
alert = d.switch_to.alert

ActionChains库

“Action库是selenium中提供模拟鼠标、键盘行为的库 。”

 库的导入和相关原则

# 使用语句 from selenium.webdriver import ActionChains 导入外部动作驱动
# d为上文定义的浏览器驱动,实例化得到浏览器外部动作驱动ad
ad = ActionChains(d)    # 行为链实例化,输入参数为驱动,
ad.perform()    # 行为开始执行的标识,必不可少!!!!!!

# 行为链以队列形式保存,执行时顺序执行
# perform()为行为链开始执行的标识
# 行为链演示
# 顺序执行:先点击,再输入,最后移动
ad.click('点击的元素').send_keys('输入的元素').move_to_element('移动的目的地').perform()


# 此模块的学习需要建立在元素定位的基础上,点击的元素均需要通过定位获取
# 示例:单击通过id定位的元素A:1.定位 2.单击 3.执行
A = d.find_element('id', '我是元素A的id标识')  # 定位元素A
ad = ActionChains(d)    # 实例化外部动作驱动
ad.click(A).perform()   # 单击并执行

# 其他:
ad.send_keys('输入内容')        # 对当前元素输入指定内容
ad.send_keys_to_element('输入内容')     # 对指定元素输入指定内容
ad.reset_actions()      # 重置行为,清除已有的行为

 模拟鼠标

# 模拟鼠标操作
# 如果不传入参数则默认执行位置为鼠标当前坐标

ad.click('单击的元素').perform()   # 单击执行
ad.double_click('双击的元素').perform()      # 双击执行
ad.context_click('点击的文本').perform()     # 点击文本执行


# 以下仅做语法讲解,没有perform表示不执行,实际应用需要在合适位置加perform
ad.click_and_hold('单击并长按的元素')       # 单击并长按
ad.release('释放的元素')     # 释放单击长按的元素


ad.drag_and_drop('开始元素', '结束元素')    # 鼠标左键滑动(按位置)
ad.drag_and_drop_by_offset('开始元素', 'x坐标偏移量', 'y坐标偏移量')  # 鼠标左键滑动(按偏移量)

ad.scroll(3, 4, 30, 40)     # 鼠标滚轮,参数依次为x起始坐标、y起始坐标、x坐标滚动量、y坐标滚动量

模拟键盘

# 组合键使用,通常一起出现,执行完动作后记得松开按键
ad.key_down('按下的按键', '按下的位置')
ad.key_up('松开的按键', '松开的位置')

# 当使用按键时,通常会使用Keys库,通过语句 from selenium.webdriver import Keys 获取Keys库
# 示例,在位置A,按下ctrl键,并松开
ad.key_down(Keys.CONTROL, A)
ad.key_up(Keys.CONTROL, A)

# Keys库支持的按键类型详见下文
# 不使用Keys库,也可通过字符串代替,按键对应字符串详见下文Keys库
# 例如:
# 在位置A按下ctrl
# ad.key_down('\ue009', A)

 Keys库

“ 提供模拟键盘快捷输入,以及对应字符串代码供参考使用 。”

ADD = '\ue025'
ALT = '\ue00a'
ARROW_DOWN = '\ue015'
ARROW_LEFT = '\ue012'
ARROW_RIGHT = '\ue014'
ARROW_UP = '\ue013'
BACKSPACE = '\ue003'
BACK_SPACE = '\ue003'
CANCEL = '\ue001'
CLEAR = '\ue005'
COMMAND = '\ue03d'
CONTROL = '\ue009'
DECIMAL = '\ue028'
DELETE = '\ue017'
DIVIDE = '\ue029'
DOWN = '\ue015'
END = '\ue010'
ENTER = '\ue007'
EQUALS = '\ue019'
ESCAPE = '\ue00c'
F1 = '\ue031'
F10 = '\ue03a'
F11 = '\ue03b'
F12 = '\ue03c'
F2 = '\ue032'
F3 = '\ue033'
F4 = '\ue034'
F5 = '\ue035'
F6 = '\ue036'
F7 = '\ue037'
F8 = '\ue038'
F9 = '\ue039'
HELP = '\ue002'
HOME = '\ue011'
INSERT = '\ue016'
LEFT = '\ue012'
LEFT_ALT = '\ue00a'
LEFT_CONTROL = '\ue009'
LEFT_SHIFT = '\ue008'
META = '\ue03d'
MULTIPLY = '\ue024'
NULL = '\ue000'
NUMPAD0 = '\ue01a'
NUMPAD1 = '\ue01b'
NUMPAD2 = '\ue01c'
NUMPAD3 = '\ue01d'
NUMPAD4 = '\ue01e'
NUMPAD5 = '\ue01f'
NUMPAD6 = '\ue020'
NUMPAD7 = '\ue021'
NUMPAD8 = '\ue022'
NUMPAD9 = '\ue023'
PAGE_DOWN = '\ue00f'
PAGE_UP = '\ue00e'
PAUSE = '\ue00b'
RETURN = '\ue006'
RIGHT = '\ue014'
SEMICOLON = '\ue018'
SEPARATOR = '\ue026'
SHIFT = '\ue008'
SPACE = '\ue00d'
SUBTRACT = '\ue027'
TAB = '\ue004'
UP = '\ue013'
ZENKAKU_HANKAKU = '\ue040'

 

有关Selenium.Webdriver最新语法教程(附Chrome实例演示)的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  6. ruby - 覆盖相似的方法,更短的语法 - 2

    在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a

  7. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  8. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  9. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  10. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

随机推荐