selenium 常用操作汇总

news/2024/4/28 5:53:32/文章来源:https://www.cnblogs.com/chzxx/p/16615069.html

使用selenium

  1、查看Chrome版本去下载浏览器驱动 驱动下载链接

  2、selenium官方网站 官方文档

selenium通信原理

  

  1. 对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
  2. 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
  3. HTTP Server接收到请求后根据请求来具体操控对应的浏览器
  4. 浏览器执行具体的测试步骤
  5. 浏览器将步骤执行结果返回给HTTP Server
  6. HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息。

  那为什么同一个浏览器驱动即可以处理Java语言的脚本,也可以处理Python语言的脚本呢?

    这就要提到WebDriver基于的协议:JSON Wire protocol

      1、JSON Wire protocol是在http协议基础上,对http请求及响应的body部分的数据的进一步规范

      2、在WebDriver中为了给用户以更明确的反馈信息,提供了更细化的http响应状态码

      3、body部分主要传送具体的数据,在WebDriver中这些数据都是以JSON的形式存在并进行传送的

  原码分析     WebDriver的结构中就是典型的C/S结构,WebDriver API相当于是客户端,而小小的浏览器驱动才是服务器端。

    1、执行webdriver.Chrome() -> 就会去启动一个子进程执行浏览器驱动监听端口号,这个驱动内部实现了一个soket 的server端

    2、父类remoteWebDriver中实现了接口提供使用  -》 调用接口最终会执行excute方法去执行

    3、excute方法解析好具体的操作  根据http协议去向driver内部的server发起请求

    4、浏览器驱动就去执行对应的浏览器执行操作

 

WebDriver核心方法和属性

1 driver.page_source #网页资源
2 driver.title             # 网页标题
3 driver.window_handles  # 窗口句柄
4 driver.back()                # 后退
5 driver.current_url           # 当前url 
6 driver.maximize_window()  # 窗口最大化
7 driver.fullscreen_window()  # 截图
8 driver.get_cookies()  #获取cookies

WebElement核心方法和属性

 1 ele.get_attribute("name")  # 获取元素的name属性
 2 driver.find_element_by_tag_name("form").submit() # 表单提交
 5 import time
 7 from selenium import webdriver
 8 
 9 driver = webdriver.Chrome()
10 driver.get("http://localhost:8000/login/")
11 driver.find_element_by_id("id_name").send_keys("admin")
12 driver.find_element_by_id("id_passwd").send_keys("admin123")
13 driver.find_element_by_name("remember").click()
14 if driver.find_element_by_name("remember").is_selected():  # 查看是否被选中
15     print("记住密码")
16 else:
17     print("位被选中")
18 driver.find_element_by_tag_name("form").submit() # 提交表单
19 
20 time.sleep(2)
21 driver.quit()

等待元素出现方式

  1、隐性等待  driver.implicitly_wait(10)  -> 等待整个document页面元素加载完毕

  2、显性等待   WebDriverWait(driver, 10, 0.2).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))) 
 1 from selenium import webdriver
 2 from selenium.webdriver.common.by import By
 3 from selenium.webdriver.support.ui import WebDriverWait
 4 from selenium.webdriver.support import expected_conditions as EC
 5 
 6 driver = webdriver.Firefox()
 7 driver.get("http://somedomain/url_that_delays_loading")
 8 try:
 9     element = WebDriverWait(driver, 10, 0.2).until(  # 每隔0.2秒钟轮询一次,10秒钟元素未出现则会报等待超时
10         EC.presence_of_element_located((By.ID, "myDynamicElement")))
11 finally:
12     driver.quit()

  显性等待源码解析

  expected_conditions 提供的方法 (了解即可,使用时查看源码)

 1             title_is                              标题是某内容
 2             title_contains                        标题包含某内容
 3             presence_of_element_located           节点加载出,传入定位元组,如 (By.ID, 'p')
 4             visibility_of_element_located         节点可见,传入定位元组
 5             visibility_of                  可见,传入节点对象
 6             presence_of_all_elements_located      所有节点加载出
 7             text_to_be_present_in_element         某个节点文本包含某文字
 8             text_to_be_present_in_element_value   某个节点值包含某文字
 9             frame_to_be_available_and_switch_to_it frame    加载并切换
10             invisibility_of_element_located       节点不可见
11             element_to_be_clickable               节点可点击
12             staleness_of                          判断一个节点是否仍在 DOM,可判断页面是否已经刷新
13             element_to_be_selected                节点可选择,传节点对象
14             element_located_to_be_selected        节点可选择,传入定位元组
15             element_selection_state_to_be         传入节点对象以及状态,相等返回 True,否则返回 False
16             element_located_selection_state_to_be   传入定位元组以及状态,相等返回 True,否则返回 False
17             alert_is_present                是否出现 Alert

  案例演示

1 from selenium.webdriver.support import expected_conditions as EC
2 # 案例演示
3 wait = WebDriverWait(driver, 10)
4 element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))

  自定义expected_conditions

 

窗口句柄相关

1   driver.window_handles:获取浏览器打开的所有窗口句柄
2 
3   driver.switch_to_window(browser.window_handles[1]) 切换到对应窗口

ActionChains 鼠标移动、鼠标按钮操作、按键和上下文菜单交互

       1、说明

     当调用 ActionChains 对象上的操作方法时, 动作存储在 ActionChains 对象的队列中。

          当调用 perform() 时,事件会按照它们的顺序触发 正在排队

  2、案例

  menu = driver.find_element(By.CSS_SELECTOR, ".nav")hidden_submenu = driver.find_element(By.CSS_SELECTOR,".nav #submenu1")ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

  3、ActionChains提供的常用方法

 1         click_and_hold(element)  按住鼠标左键
 2         double_click(element)  双击一个元素
 3         drag_and_drop(源元素,目标元素)  在源元素上按住鼠标左键,然后移动到目标元素并释放鼠标按钮
 4         drag_and_drop_by_offset( 源 , xoffset , yoffset )
 5         move_by_offset( xoffset , yoffset )移动鼠标到x,y坐标
 6         move_to_element( element ) 将鼠标移动到元素的中间
 7         pause(sec) 等待指定秒数
 8         release(element) 释放鼠标
 9         scroll( x: int , y: int , delta_x: int , delta_y: int , 持续时间: int = 0 , origin: str = 'viewport' )
10             将滚轮滚动信息发送到浏览器进行处理。
11             参数:
12                 x:起始X坐标
13                 y:起始Y坐标
14                 delta_x:鼠标在x轴上滚动的距离
15                 delta_y:鼠标在y轴上滚动的距离

Alert 提示框 selenium.webdriver.common.alert.Alert 模块

 1   接受和关闭警告提示
 2     Alert(driver).accept()
 3     Alert(driver).dismiss()
 4   需要输入值的提示框
 5     Alert(driver).send_keys('xxx').accept()
 6   获取文本
 7     Alert(driver).text
 8   案例演示
 9         # confirm,alert都是这样的写法
10     al = self.driver.switch_to.alert
11     al.dismiss()

多选下拉框相关操作案例

 1 # 下拉框
 2     from selenium.webdriver.support.ui import Select
 3     sl = driver.find_element_by_id("...")
 4     sl.first_selected_option.text  // 输出第一个选项的值
 5     sl.select_by_index(1)  // 通过索引去勾选
 6     sl.select_by_value(“笑嘻嘻”)   // 通过value属性去勾选
 7     sl.select_by_visible_text(“笑嘻嘻”)   // 通过options标签中间包着的text值去勾选
 8 
 9     sl.options //返回所有的选项
10     sl.options[0].is_selected() // 是否被勾选
11     sl.all_selected_options  // 当前勾选的选项
12 
13     sl.deselected_all() // 取消全部选项

 

无头模式设置

1 # 无头模式
2     # from selenium.webdriver.remote.webelement import WebElement
3     opts = webdriver.ChromeOptions()
4     opts.headless=True
5     driver = Chrome(chrome_options=opts)

滑块操作案例

1 # 滑块拖动案例
2     // 小滑块
3         ele = driver.find_element(..div)
4         x = ele.location['x']
5         y = ele.location['y']
6     // 大滑块
7         ele1 = driver.find_element("...")
8         width = ele1.size["width"]  
9         ActionChains(driver).drag_and_drop_by_offset(ele,x+width,y).perform()

webelement对象 常用方法 (了解即可,使用时查看源码)

        current_url: 获取当前url的一个类属性

        get_cookies(): 获取cookies -> 返回[{...}]

        page_source:  获取网页资源

        webelement.get_attribute('class'):  获取属性

        webelement.text: 获取元素的文本内容

        获取ID、位置、标签名、大小

            element.id

        element.location

        element.tag_name

        element.size

        driver.switch_to.frame() 切换frame

        driver.switch_to.parent_frame() 切换回父frame

        diver.forward() 前进

        diver.back() 后退

 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_2980.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不想当Window的Dialog不是一个好Modal,弹窗翻身记

Windows的灵魂是什么?当然是Window,当方便快捷的多窗口进入人们视野的时候,大家无不为之惊呼太好用了!!弹窗是我们熟视无睹的一种交互方式,经常用到,但从没好好想过这种交互行为背后的意义... 弹窗是Windows的灵魂 Windows的灵魂是什么?当然是Window,当方便快捷的多窗…

工具 -- git 汉化

说明 来源转载 https://blog.csdn.net/mansir123/article/details/121692125Git GUI汉化包来源 https://github.com/stayor/git-gui-zh转载 https://www.cnblogs.com/chenghu/articles/12678500.html1、git bash 汉化 这个Git bash本身就支持中文,只需要在打开Git bash后命令窗…

好多不懂的和bug

1、知道了MD5, 2、知道了validate是干什么的,(validate中的rules中编写验证规则,规范输入),可以在管理员在网站修改数据的时候对输入进行限制。1 <script type="text/javascript">2 $(function(){3 $("#addForm").validate({4 rul…

DevTools 无法加载来源映射:无法加载 webpack net::ERR_UNKNOWN_URL_SCHEME

问题:DevTools 无法加载来源映射:无法加载 webpack:///node_modules/element-plus/es/components/notification/src/notification.mjs.map 的内容:Fetch through target failed: Unsupported URL scheme; Fallback: HTTP 错误:状态代码 404,net::ERR_UNKNOWN_URL_SCHEME 当…

JAVA进阶--static、工具类、单例、继承--2022年8月28日

第一节 static静态关键字1、成员变量的分类和访问分别是什么样的?静态成员变量(有static修饰,属于类,加载一次,可以被共享访问)访问格式:类名.变量名(推荐)对象名.变量名(不推荐)实例成员变量(无static修饰,属于对象)访问格式:对象名.变量名2、两种成员变量各自…

QA特辑 | 看了这场直播,我找到了设备指纹“从不说谎”的原因

除了身份证外,设备指纹可能是唯一一个可以证明你是谁的方法。 究其原因,就在于设备指纹的唯一性和稳定性。 8月 25 日下午 15 点,顶象技术总监杜威就设备指纹的唯一性和稳定性的核心算法展开分享。直播过程中,我们也收到了一系列关于设备指纹唯一性稳定性核心算法的疑问,现…

YBTOJ [树状数组] 二进制

哇咔咔,此乃真好题!这种东西当然要抢个榜首辣qaq。 Solution 首先不带 \(+x\) 的做法,相信大家都会,维护一下全局二进制每一位 \(1\) 的个数,把 \(y\) 二进制拆分一下,就知道答案了。 这个 \(+x\) 真滴很恶心啊! 考虑这样一个事实,非常滴实用: 对于一个 \(x\) \(and\)…

科普达人丨一图看懂安全组

建议收藏安全组是一种虚拟防火墙,通过安全组规则控制 ECS 实例出/入方向的流量,保障云服务器的安全。本文将通过介绍安全组的工作原理、功能、默认安全组和规则,以及快速上手使用安全组的操作等方面的介绍,您对于安全组有一个全面的了解,帮助您更好、更安全地开展业务上云…

京东云PostgreSQL在GIS场景的应用分享

在地图或地理信息有关的场景里,地址关键词的检索尤其重要。比如打开百度地图,想要查询某个位置的信息“北京市海淀区清华东路17号中国农业大学”,往往我们输入的是关键词“中国农业大学”而不是精确到街道的详细地址信息。在地图或地理信息有关的场景里,地址关键词的检索尤…

超全的正则表达式速查手册

一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 正…

HCIA学习笔记二十六:手工负载分担模式二层链路聚合

一、链路聚合的应用场景• 链路聚合一般部署在核心结点,以便提升整个网络的数据吞吐量。 二、链路聚合• 链路聚合能够提高链路带宽,增强网络可用性,支持负载分担。 三、链路聚合模式• 手工负载分担模式下所有活动接口都参与数据的转发,分担负载流量。 • LACP模式支持链路…

Kotlin的空检查

我们在使用Java语言时,经常会出现空指针异常NullPointerException。Kotlin基于过往语言设计的经验对这一问题进行了改良,把运行时可能出现的null问题,以编译时错误的方式,提前在编译期强迫我们重视起来,而不是等到运行时报错,防患于未然,提高我们程序的健壮性。 Kotlin语…

智慧城市建设的三个阶段

今天的中国城市,正在疾步向前拥抱智慧时代,我国是全球智慧城市建设最为积极的国家之一。近年来,随着政策红利进一步释放与资金的大量投入,智慧城市产业也将迎来新的发展高潮。智慧城市建设步入快车道时代!据不完全统计,中国智慧城市的发展数量已经超过500个,居世界之最。…

2021年 西南石油大学超算与并行计算团队南充校区分队 第二届招新赛题解

2021年SWPU(南充)超算团队招新赛总体难度并不是很大,大部分题目考察的是基本的编程能力,题目中涉及到了一些并行计算相关的名词和知识,选手在参加比赛的同时,既能够展示自己的实力,也可以学习到相关的一些知识。下面是本次招新赛的题目A.简单输出 题目描述:题目要求:输出…

Java并发编程总结

——《Java多线程编程实战指南》学习及其他参考博客总结 串行、并行、并发 (1)串行:顺序执行多个任务,一个时刻只有一个任务在执行 (2)并行:多个CPU(核)同一时间多个任务,一个时刻有多个任务在执行 (3)并发:单个CPU(核)同一时间间隔内交替执行多个任务,一个时刻只有一…

学习随笔——洛谷题目P1636解答

摘要:欧拉图的应用。 题目原地址如下:https://www.luogu.com.cn/problem/P1636 题目截图如下: 一笔画问题,考察欧拉回路的定义,即所有节点的入度出度的和都为偶数即可满足欧拉回路的性质。我们为方便分析可加入一条线,发现加入一条边后会改变两个点的度数和,只需寻找奇数…

Spring的自动化装配

在Spring中,对象无需自己查找和创建与其所关联的其他对象。相反,容易负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管理的组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组…

jQuery使用ajax

1.导入jQuery的js库2.jQuery发送单一的get请求$.get(url:接口地址,data:{id:1,name:2,......}function(res){// res是服务器返回的数据} ) 3.jQuery发送单一的post请求$.post(url:接口地址,data:{id:1,name:哈哈哈,......}function(res){// res是服务器返回的数据} ) 4.jQuery发…

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法 - 悟寰轩-叶秋 - 博客园 https://www.cnblogs.com/sunxucool/p/3449068.html 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有提到,…

引入VUE的方式(8种)

第一类: 1、本地引入 把vue的js文件下载下来引入 2、CDN引入 把vue.js网址引入 3、把vue.js文件放在项目文件夹src中引入项目 然后webpack打包4、编辑器直接生成cdn的方式第二类: 5、自己构建vue的脚手架/* 1.新建项目 alipay 2.初始化配置文件:npm init -y 3.下载依赖:npm…