Selenium-WEB自动化学习笔记–更新ing

DAY1

01PART什么是 web ui 自动化

自动化测试是指通过自动化测试工具或其他手段,按照测试人员的测试计划进行自动测试,目的是减轻手工测试的工作量。

简单来说就是用代码模仿手工操作

1
集中注意点
测试自动化并不是为了赢得老板的赞赏,或者认为这是一个很潮的技术,不用就会落后,而是为了发现问题,提高产品的质量。

UI自动化测试应该集中在:
1)UI的文本,图片显示正确性
2)UI的交互逻辑正确性测试
3)UI上的用户行为正确性测试

2
难点
对比手工UI测试,UI自动化测试有如下的难点:
  1)从UI测试的角度来说,一个非“预期”产生的缺陷很难被自动化测试发现,而手工测试则能轻松的发现这个缺陷;
  2)UI本身的变化性,要想达到和手工测试相同的覆盖率,单纯的UI自动化测试往往很难证明自己的投资回报;
  3)UI控件元素本身识别的复杂性;
  4)UI自动化测试出现问题时,恢复到下一条测试case执行的场景是复杂的。因为出现这种问题的意外,是非“预期”的;
  5)UI的测试case,有很多是关于用户交互方面的,而这方面也其一定的复杂性;

3
什么时候需要进行 ui 自动化测试
从本质上讲,非UI测试和UI测试,是互为补充的,根据其成本和特性的不同,在实际工程应用中也应该领会运用。其基本原则:非UI自动化测试用例为主,UI自动测试为必要的补充,考虑成本因素,UI自动测试可以被手动测试所取代
  1)基本用户场景测试和验收确认(acceptance)测试用例
  2)逻辑与用户界面绑定在的一起,无法绕过UI直接测试核心逻辑模块。

02PARTselenium 与 webdriver

Selenium 是一个用于 Web 测试的工具,测试运行在浏览器中,就像真正的用户在手工操作一样。支持所有主流浏览器
这个工具的主要功能包括:
  1)测试与浏览器的兼容性 ,应用程序是否能够很好地工作在不同浏览器和操作系统之上
  2)测试系统功能,创建回归测试检验软件功能和用户需求

WebDriver 就是对浏览器提供的原生API进行封装,使其成为一套更加面向对象的Selenium WebDriver API。
使用这套API可以操控浏览器的开启、关闭,打开网页,操作界面元素,控制Cookie,还可以操作浏览器截屏、安装插件、设置代理、配置证书等

03PARTHTML 扫盲运动

HTML 元素语法
HTML 元素以开始标签起始
HTML 元素以结束标签终止
元素的内容是开始标签与结束标签之间的内容
某些 HTML 元素具有空内容(empty content)
比如这个,换行标签
空元素在开始标签中进行关闭(以开始标签的结束而结束)
大多数 HTML 元素可拥有属性
HTML 文档由嵌套的 HTML 元素构成
HTML 属性
HTML 元素可以设置属性
属性可以在元素中添加附加信息
属性一般描述于开始标签
属性总是以名称/值对的形式出现,比如:name=“value”
HTML 标准属性参考手册:https://www.runoob.com/tags/ref-standardattributes.html

04PART 环境搭建

1、为 Python 安装 selenium模块,pip install selenium
2、下载对应浏览器驱动
Chromedriver
http://npm.taobao.org/mirrors/chromedriver/
版本对照表:https://blog.csdn.net/BinGISer/article/details/88559532

Firefoxdriver
https://github.com/mozilla/geckodriver/releases
版本对照表:https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html

05PART使用 selenium 访问百度并搜索

反爬虫设置

from selenium import webdriver
options = webdriver.ChromeOptions()

设置为开发者模式,防止被各大网站识别出来使用了Selenium

屏蔽 windows.navigator.webdriver

options.add_experimental_option(‘excludeSwitches’, [‘enable-automation’])

# 不加载图片,加快访问速度

options.add_experimental_option(

“prefs”, {“profile.managed_default_content_settings.images”: 2})

06PARTui 自动化操作流程
选择界面元素
根据元素的特征:ID,Name,Class,Tag,等
根据元素特征和关系:css,xpath

操作界面元素
输入操作:点击、输入文字、拖拽等
输出操作:获取元素的各种属性

根据界面上获取的数据进行分析和处理

07PART元素定位大法

find_element_by_id:通过ID进行匹配查找,只返回匹配到的一个元素
find_element_by_name:通过name进行匹配查找,只返回匹配到的一个元素
find_element_by_xpath:通过xpath进行匹配查找,只返回匹配到的一个元素
find_element_by_link_text:通过链接内容进行匹配查找,只返回匹配到的一个元素
find_element_by_partical_link_text:通过部分链接内容进行匹配查找,只返回匹配到的一个元素
find_element_by_tag_name:通过标签名称进行匹配查找,只返回匹配到的一个元素
find_element_by_class_name:通过class名称进行匹配查找,只返回匹配到的一个元素
find_element_by_css_selector:通过CSS选择器进行匹配查找,只返回匹配到的一个元素
值得注意的是,上面方法只会匹配查找只会获取第一个元素。除了上面这些查找单个元素的方法之外,Selenium还定义查找多个元素的方法:
find_elements_by_name:通过name进行匹配查找,返回所有匹配到的元素列表
find_elements_by_xpath:通过xpath进行匹配查找,返回所有匹配到的元素列表
find_elements_by_link_text:通过链接内容进行匹配查找,返回所有匹配到的元素列表
find_elements_by_partical_link_text:通过部分链接内容进行匹配查找,返回所有匹配到的元素列表
find_elements_by_tag_name:通过标签名称进行匹配查找,返回所有匹配到的元素列表
find_elements_by_class_name:通过class名称进行匹配查找,返回所有匹配到的元素列表
find_elements_by_css_selector:通过CSS选择器进行匹配查找,返回所有匹配到的元素列表
from selenium import webdriver
import time

创建浏览器驱动

driver = webdriver.Chrome(“D:toolseleniumchromedriver.exe”)

访问网址

driver.get(“D:testscriptstudyseleniumStuday1test.html”)

“””

元素定位的第一种方式 css_selector,根据 css 选择器定位

寻找元素

textElement = driver.find_element_by_css_selector(“body > div > p:nth-child(1)”)

打印元素的文本信息

print(textElement.text)
“””

“””

元素定位的第二种方式 xpath,根据 xpath 路径定位

寻找元素

textElement = driver.find_element_by_xpath(“[表情]ml/body/div/p[2]”)

打印元素的文本信息

print(textElement.text)
“””

“””

元素定位的第三种方式,根据 id 定位

寻找元素

inputElement = driver.find_element_by_id(“58680504-89fc-42d4-ab86-afc9456f880e”)
inputElement.send_keys(“荀尘”)
“””

“””

元素定位的第四种方式,根据 name

寻找元素

inputElement = driver.find_element_by_name(“passwd”)
inputElement.send_keys(“123”)
“””

“””

元素定位的第五种方式,根据 class_name 定位

寻找元素

linkElement = driver.find_element_by_class_name(“mnavspdot”)
linkElement.click()
“””

“””

元素定位的第六种方式,根据 tag_name 定位

寻找元素

tagElement = driver.find_element_by_tag_name(“p”)

打印标签的文本内容

print(tagElement.text)
“””

“””
元素定位的第七种方式,根据链接文本,精准搜索

寻找元素

linkElement = driver.find_element_by_link_text(“抗击肺炎”)
linkElement.click()
“””

“””

元素定位的第八种方式,根据链接文本,模糊搜索

寻找元素

linkElement = driver.find_element_by_partial_link_text(“抗击”)
linkElement.click()
“””

获取元素列表

tagElementSli = driver.find_elements_by_tag_name(“p”)
for i in tagElementSli:
print(i.text)

根据 css 选择器获取元素列表

inputElement = driver.find_elements_by_css_selector(“body > div:nth-child(2) > input”)
for i in inputElement:
print(i.get_attribute(“name”))

除了 find_element_by_某某类型的定位方法(“元素定位表达式”), find_element() 函数也可以完成任务
from selenium import webdriver

需要先引入这个

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

inputElement = driver.find_element(By.ID, “58680504-89fc-42d4-ab86-afc9456f880e”)

同样也有对应的获取列表的方法

inputElementSli = driver.find_elements(By.NAME, “pwd”)

注意:
1、根据 class_name 进行定位的时候,有时候会遇到复合类,也就是 class 属性中间有空格,class 属性比较特殊,class属性中间的空格是间隔符号,表示的是一个元素有多个class的属性名称,此时元素定位的时候任取一个即可(不保证唯一定位)
2、selenium 没有提供判断元素是否存在的功能,所以当你需要判断一个元素存不存在的时候,直接定位可能会报错。我们可以去匹配一个元素列表,列表为空则元素不存在,列表不为空则元素存在

技巧,在进行元素定位的时候,有时会遇到一些特别难以定位的元素,此时你可以使用下边这种模式,分步骤定位,一步步缩小定位范围
ele = driver.find_elements_by_xpath(“//div[@id=‘category-block’]//ol/li”)
b = ele.find_elements_by_xpath(’.//li[@class=‘subcate-item’]//span’)


DAY2

一、获取断言信息
不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较称之为断言。
我们通常可以通过获取title 、URL和text等信息进行断言
title:用于获得当前页面的标题
current_url:用户获得当前页面的URL
text:获取标签对之间的文本信息
注意:
1、标签元素如果不展示在页面上,获取结果为空
2、标签对中间没有值,获取结果为空
3、如 input 标签之类的标签,获取结果为空

get_attribute方法,获取元素某个属性的值
ele.get_attribute(‘href’)
上述代码获取 ele 这个元素的 href 属性的值

二、设置元素等待
大多数Web应用程序都是使用Ajax和Javascript开发的。当浏览器加载页面时,我们想要与之交互的元素可能尚未被加载出来。此刻不仅难以识别元素,而且很容易定位不到元素,抛出异常。使用Waits,我们可以解决此问题

WebDriver提供了两种类型的等待:显式等待和隐式等待
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get(“http://www.baidu.com”)

每隔 0.5s 检查一次(默认就是 0.5s), 最多等待 5 秒

element = WebDriverWait(driver, 5, 0.5).until(
EC.visibility_of_element_located(
(By.ID, “kw”)
)
)
element.send_keys(‘selenium’)
driver.quit()

隐式等待:
WebDriver提供了
driver.implicitly_wait(10)
方法来实现隐式等待,默认参数的单位为秒,本例中设置等待时长为10秒。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到.
假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常

03PARTxpath 高级用法

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似

表达式 描述
nodename 选取此节点的所有子节点,类似 css 中的标签选择器
/ 从根节点选取,也就是当前节点的最顶层(默认情况下当前节点是 html 最顶层,若从某元素开始,当前节点为此元素)
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性

注意:当你使用 父元素.find_element_by_xpath 这种方式定位的时候,元素定位表达式必须以点开头,如
ele = driver.find_elements_by_xpath(“//div[@id=‘category-block’]//ol/li”)
b = ele.find_elements_by_xpath(’.//li[@class=‘subcate-item’]//span’)
如果不用点,会从整个文档开始找,即使你前边使用了父元素也没有效果,xpath 就是这样实现的 ╮(╯▽╰)╭

缺点:
xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素, 这是个非常费时的操作, 如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢

绝对路径定位
从顶层 html 开始往下找,像文件夹一样写的完整路径,
缺点:一旦页面结构发生改变,路径也随之失效,必须重新定位。 所以不推荐使用绝对路径的写法

相对路径定位
绝对路径 以 “/” 开头, 让xpath 从文档的根节点开始解析
相对路径 以”//” 开头, 让xpath 从文档的任何元素节点开始解析(也就是说每个节点都作为起点找一下

索引定位
//input[2] 任意节点下的第二个 input 标签

属性定位
//input[@name=“username” and @type=“text”] 任意节点下name 属性为 username 的 input 标签
starts-with 例子: input[starts-with(@id,‘ctrl’)] 解析:匹配以ctrl开始的属性值
contains() 例子:Input[contains(@id,‘userName’)] 解析:匹配含有userName属性值

其他定位方式
parent 选取当前节点的父节点
//*[@id=“content_views”]/p[51]/span[1]/parent::p

ancestor 选取当前节点的所有先辈(父、祖父等)
//*[@id=“content_views”]/p[51]/span[1]/ancestor::div

ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身(不包含叔叔伯伯
//*[@id=“content_views”]/p[51]/span[1]/ancestor-or-self::div
#例如这个,包含自身,但如果自身不是div那和ancestor没差

descendant选取当前节点的所有后代元素(子、孙等)
//*[@id=“content_views”]/descendant::span

descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身
//*[@id=“content_views”]/p[51]/descendant-or-self::p
#例如这个,包含自身,但如果自身不是p那和ancestor没差

preceding 选取文档中当前节点的开始标签之前的所有节点
//*[@id=“content_views”]/p[51]/preceding::p

preceding-sibling选取当前节点之前的所有同级节点
//*[@id=“content_views”]/p[51]/span[2]/preceding-sibling::span

following 选取文档中当前节点的结束标签之后的所有节点(包括自己及自己的后代元素
//*[@id=“content_views”]/p[51]/following::p

following-sibling选取当前节点之后的所有同级节点
//*[@id=“content_views”]/p[51]/span[2]/following-sibling::span


DAY3

01PART控制浏览器操作

1、控制浏览器大小
WebDriver提供了set_window_size()方法来设置浏览器的大小
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(“http://www.baidu.com”)

参数数字为像素点

print(“设置浏览器宽600、高600显示”)
driver.set_window_size(600, 600)

driver.quit()
在PC端执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行,那么可以使用maximize_window()方法使打开的浏览器全屏显示
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(“http://www.baidu.com”)

设置全屏显示

driver.maximize_window()

# 设置最小化浏览器

driver.minimize_window()

driver.quit()

2、控制浏览器前进、后退、刷新

from selenium import webdriver

driver = webdriver.Firefox()

访问百度首页

driver.get(“http://www.baidu.com”)

访问新闻页面

driver.get(“http://news.baidu.com”)

返回(后退)到百度首页

driver.back()

前进到新闻页

driver.forward()

刷新界面

driver.refresh()

driver.quit()

02PARTwebdriver 常用方法

1、点击、输入

我们定位元素之后要对这个元素进行操作, 或单击(按钮、链接等) 或输入(输入框) , 下面就来认识 WebDriver 中最常用的几个方法:
clear(): 清除文本。
send_keys (value): 模拟按键输入(被操作元素需要是个 input 标签)。
click(): 单击元素。
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(“https://www.baidu.com”)

driver.find_element_by_id(“kw”).send_keys(“selenium”) # 输入内容
driver.find_element_by_id(“kw”).clear() # 清除内容
driver.find_element_by_id(“kw”).send_keys(“python”) # 输入内容
driver.find_element_by_id(“su”).click() # 点击内容

driver.quit()

2、提交

submit()方法用于提交表单。 例如, 在搜索框输入关键字之后的“回车” 操作, 就可以通过该方法模拟
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(“https://www.baidu.com”)

search_text = driver.find_element_by_id(‘kw’)
search_text.send_keys(‘selenium’)
search_text.submit()

driver.quit()

3、其他方法

size: 返回元素的尺寸。
text: 获取元素的文本。
get_attribute(name): 获得属性值。
is_displayed(): 检测该元素是否用户可见
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(“http://www.baidu.com”)

获得输入框的尺寸

size = driver.find_element_by_id(‘kw’).size
print(size)

返回百度页面底部备案信息

text = driver.find_element_by_id(“cp”).text
print(text)

返回元素的属性值, 可以是 id、 name、 type 或其他任意属性

attribute = driver.find_element_by_id(“kw”).get_attribute(‘type’)
print(attribute)

返回元素的结果是否可见, 返回结果为 True 或 False

result = driver.find_element_by_id(“kw”).is_displayed()
print(result)

driver.quit()

三、 css 定位高级语法
推荐的定位方式的优先级
优先级最高:ID
优先级其次:name
优先级再次:CSS selector
优先级再次:Xpath

针对css selector和xpath的优先级做一个简单的说明
在项目中我们可能用的最多的是css或者xpath,那么针对这两种,我们优先选择css,原因在哪些br> 原因1:css是配合html来工作,它实现的原理是匹配对象的原理,而xpath是配合xml工作的,它实现的原理是遍历的原理,所以两者在设计上,css性能更优秀
原因2:语言简洁,明了,相对xpath
原因3:前段开发主要是使用css,不使用xpath,所以在技术上面,我们可以获得帮助的机会非常多

定位元素的注意事项(划重点)
找到待定位元素的唯一属性
如果该元素没有唯一属性,则先找到能被唯一定位到的父元素/子元素/相邻元素,再使用“>”,” “,”+”等进行辅助定位。
不要使用随机唯一属性定位
最重要的是多跟研发沟通,尽量把关键元素加上ID或者name,并减少不合理的页面元素,例如重复ID这样的事情最好不要发生。

CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明:

我们做 web 自动化测试,只需关注 选择器部分,帮我们找到元素

id 选择器
id 选择器可以选中具有特定 id 的 HTML 元素
CSS 中 id 选择器以 “#” 来定义。
以下的样式规则应用于元素属性 id=“para1”:
#para1
{
text-align:center;
color:red;
}

class 选择器
class 选择器可以选中具有特定 class 属性的 HTML 元素
在 CSS 中,class 选择器以 “.”号 来定义
在以下的例子中,所有拥有 class 属性为 center 的 HTML 元素均为居中
.center {text-align:center;}

标签选择器
标签选择器可以选中同类型的 html 标签元素
在以下的例子中,将所有的 p 标签设置为红色
p. {color:red;}

另外,你可以将标签选择器与属性选择器结合起来使用
以下,会将所有 class 属性为 re 的元素变成红色
p.re {color:red;}

分组选择器
分组选择器可以选中一组 HTML 元素
在 css 中,分组选择器以 “,” 来定义
以下实例,会将所有的 h1 标签、h2 标签、p 标签的内容变成红色
h1,h2,p
{
color:green;
}

属性选择器
属性选择器选择具有特定属性的 HTML 元素
以下实例将所有包含 title 属性的元素变为蓝色
[title]
{
color:blue;
}
你也可以为属性指定值
以下实例将所有 title 属性为 wa 的元素变为蓝色
[title=“wa”]
{
color:blue;
}
你也可以为元素指定标签
以下实例将所有 title 属性为 wa 的 p 标签变为蓝色
p[title=“wa”]
{
color:blue;
}
我们还支持匹配单词边界
以下实例将所有 title 属性包含单词 hello 的标签变为蓝色
#单词纬度去判断,不是包含这个单词就行,
p[title~=“hello”]
{
color:blue;
}

组合选择符
在 CSS3 中包含了四种组合方式:
后代选择器(以空格分隔)
子元素选择器(以大于号分隔)
相邻兄弟选择器(以加号分隔)
后续兄弟选择器(以小波浪号分隔)

后代选择器
后代选择器用于选取某元素的后代元素,无论层级有多深
以下实例将

元素中所有的 p 元素背景修改为黄色:
div p
{
background-color:yellow;
}

子元素选择器
与后代选择器相比,子元素选择器只能选择其父元素的直接子元素
以下实例选择了

元素中所有直接子元素


div>p
{
background-color:yellow;
}

相邻兄弟选择器
相邻兄弟选择器可选择紧接在另一元素后的元素,且二者有相同父元素
以下实例选取了所有位于

元素后的第一个

元素:
div+p
{
background-color:yellow;
}

后续兄弟选择器
后续兄弟选择器选取所有指定元素之后的相邻兄弟元素。
以下实例选取了所有

元素之后的所有相邻兄弟元素

:
div~p
{
background-color:yellow;
}

伪类
nth-child(n) 匹配属于其父元素的第 N 个子元素
nth-last-child(n),如字面意思:倒数第几个标签
nth-of-type(n),第 N 个指定类型的标签
first-child,第一个标签
last-child,最后一个标签


DAY4

一、窗口截图
webdriver 提供了 get_screenshot_as_file()函数来截取当前窗口

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get(‘http://www.baidu.com’)

截屏,截取整个页面

driver.get_screenshot_as_file(“./all.png”)

截屏,截取单个元素

ele = driver.find_element_by_id(‘kw’)
ele.screenshot(“./ele.png”)

driver.quit()

二、警告框处理
在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作
text:返回 alert/confirm/prompt 中的文字信息
accept():接受现有警告框
dismiss():取消现有警告框
send_keys(“haha”):发送文本至警告框

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get(“D:testscriptstudyseleniumStuday6警告框.html”)

# 触发对话框

driver.find_element_by_id(“bu1”).click()

al = driver.switch_to.alert

time.sleep(3)

al.accept() # 确认对话框

# 触发确认框

driver.find_element_by_id(“bu2”).click()

al = driver.switch_to.alert

al.accept() # 确认对话框

driver.find_element_by_id(“bu2”).click()

al.dismiss() # 取消对话框

触发提示框

driver.find_element_by_id(“bu3”).click()
al = driver.switch_to.alert
al.send_keys(“口罩太贵了”)
al.accept() # 确认对话框

time.sleep(3)
driver.quit()

03PART鼠标事件

用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供了一个类来处理这类事件——ActionChains
ActionChains 类提供了鼠标操作的常用方法:
perform(): 执行操作
context_click(): 右击;
double_click(): 双击;
drag_and_drop(): 拖动;
move_to_element(): 鼠标悬停。

from selenium import webdriver

引入 ActionChains 类

from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get(“https://www.baidu.cn”)

定位到要悬停的元素

above = driver.find_element_by_link_text(“设置”)

对定位到的元素执行鼠标悬停操作

ActionChains(driver).move_to_element(above).perform()

driver.quit()

04PART键盘事件

Keys()类提供了键盘上几乎所有按键的方法。 前面了解到, send_keys()方法可以用来模拟键盘输入, 除此 之外, 我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A、 Ctrl+C 等

from selenium import webdriver

引入 Keys 模块

from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get(“http://www.baidu.com”)

输入框输入内容

driver.find_element_by_id(“kw”).send_keys(“seleniumm”)

删除多输入的一个 m

driver.find_element_by_id(“kw”).send_keys(Keys.BACK_SPACE)

输入空格键+“教程”

driver.find_element_by_id(“kw”).send_keys(Keys.SPACE)
driver.find_element_by_id(“kw”).send_keys(“教程”)

ctrl+a 全选输入框内容

driver.find_element_by_id(“kw”).send_keys(Keys.CONTROL, ‘a’)

ctrl+x 剪切输入框内容

driver.find_element_by_id(“kw”).send_keys(Keys.CONTROL, ‘x’)

ctrl+v 粘贴内容到输入框

driver.find_element_by_id(“kw”).send_keys(Keys.CONTROL, ‘v’)

通过回车键来代替单击操作

driver.find_element_by_id(“su”).send_keys(Keys.ENTER)

driver.quit()
以下为常用的键盘操作:
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
……
send_keys(Keys.F12) 键盘 F12

五、iframe切换
iframe,又叫浮动帧标记,是内嵌的网页元素,可以将一个html文件嵌入到另一个html文件中显示
对iframe进行操作,需要用到以下三种方法:
switch_to_iframe() 切换到iframe上(未来会被删除,不建议使用)
switch_to.frame() 切换到iframe上
switch_to.default_content() 切换回原主页面

通过如下方式进行切换操作
#定位到iframe
iframe=driver.find_element_by_id(“x-URS-iframe”)
#切换到iframe
driver.switch_to_frame(iframe)
from selenium import webdriver
import time

driver = webdriver.Chrome(“D:toolseleniumchromedriver.exe”)

隐式等待

driver.implicitly_wait(5)
driver.get(“D:testscriptstudyseleniumStuday3test.html”)

“””
对iframe进行操作,需要用到以下三种方法:

switch_to_iframe() 切换到iframe上
switch_to.frame() 切换到iframe上
switch_to.default_content() 切换回原主页面
“””
iframe = driver.find_element_by_id(“f91fb5bc-bd95-45bf-bd77-977a2afbd25f”)
driver.switch_to.frame(iframe)
driver.find_element_by_id(“e4890ded-16e1-4445-bf8e-7f655793f332”).send_keys(“haha”)

time.sleep(5)
driver.quit()

六、多标签页切换
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。WebDriver提供了以下方法
current_window_handle:获得当前标签页句柄
window_handles:返回所有便签页的句柄
switch_to.window(标签页句柄):切换到对应的标签页
关闭标签页使用 close 方法
from selenium import webdriver

创建浏览器驱动对象

driver = webdriver.Chrome()

访问网址

driver.get(“http://www.baidu.com”)

找到搜索按钮

input_element = driver.find_element_by_id(“kw”)

输入搜索内容

input_element.send_keys(“松勤n”)

点击松勤教育官网

driver.find_element_by_css_selector(“#34 > h3 > a > em”).click()

获得当前所有打开的窗口的句柄

all_handles = driver.window_handles

for handle in all_handles:
driver.switch_to.window(handle)
print(driver.title)

退出浏览器

driver.quit()

七:补充
#页面下滑到相应位置
driver.execute_script(‘window.scrollBy(0,1000)’)
#将页面滚动条拖到底部
js=“var q=document.documentElement.scrollTop=100000”
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js=“var q=document.documentElement.scrollTop=0”
driver.execute_script(js)
time.sleep(3)
#将页面滚动条移动到页面任意位置,改变等于号后的数值即可
js=“var q=document.documentElement.scrollTop=50”
driver.execute_script(js)


DAY5

一、下拉框选择
WebDriver提供了Select类来处理下拉框
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time

实例化一个浏览器对象

driver = webdriver.Chrome(“D:toolseleniumchromedriver.exe”)

访问网址

driver.get(“D:testscriptstudyseleniumStuday3selectStu.html”)

定位到下拉框元素

ele = driver.find_element_by_id(“bc288089-c52d-497b-aa4d-71f81b24faa3”)

# 根据 value 属性选择

Select(ele).select_by_value(“3”)

根据下拉框文本选择

Select(ele).select_by_visible_text(“3333333”)

time.sleep(3)
driver.quit()
二、文件上传
对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传
对于非 input 标签实现的上传功能,我们可以通过模拟键盘敲击的方式实现,代码如下

from selenium import webdriver
import win32com.client
import time

driver = webdriver.Chrome(“D:toolseleniumchromedriver.exe”)
driver.implicitly_wait(5)
driver.get(“https://tinypng.com/”)

触发上传文件的操作

driver.find_element_by_css_selector(“#top .icon”).click()
sh = win32com.client.Dispatch(“WScript.shell”)
time.sleep(3)
sh.Sendkeys(“D:testscriptstudyseleniumStuday6qqjt.pngn”) # 无目标的,单纯的敲击键盘

driver.quit()

三、cookie 操作
WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息
WebDriver操作cookie的方法:
get_cookies(): 获得所有cookie信息
get_cookie(name): 返回字典的key为“name”的cookie信息
add_cookie(cookie_dict) : 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
delete_all_cookies(): 删除所有cookie信息

from selenium import webdriver

driver = webdriver.Firefox()
driver.get(“http://www.youdao.com”)

获得cookie信息

cookie = driver.get_cookies()

将获得cookie的信息打印

print(cookie)

driver.quit()

模拟登陆百度
from selenium import webdriver
import pprint

屏蔽 windows.navigator.webdriver

options = webdriver.ChromeOptions()

设置为开发者模式,防止被各大网站识别出来使用了Selenium

options.add_experimental_option(‘excludeSwitches’, [‘enable-automation’])

# 不加载图片,加快访问速度

options.add_experimental_option(

“prefs”, {“profile.managed_default_content_settings.images”: 2})

driver = webdriver.Chrome(
executable_path=”/Users/nathaniel/MyApp/lib/seleniumLib/chromedriver”,
options=options)
driver.implicitly_wait(10)
driver.get(“https://www.baidu.com”)
input(“手动登录百度后继续>>>”)

获取 cookies 信息,这里至少要等待一下,等百度网站计算 cookie

pprint.pprint(driver.get_cookies())

driver.quit()

from selenium import webdriver

这是之前获取到的 cookies, 记得把每一个字典的 expiry 注释

cookies = [{‘domain’: ‘.baidu.com’,
‘httpOnly’: False,
‘name’: ‘H_PS_PSSID’,
‘path’: ‘/’,
‘secure’: False,
‘value’: ‘1431_21125_30839_31186_30909_31228_30823_31086_31164_22158’},
{‘domain’: ‘.baidu.com’,
# ‘expiry’: 1845350230.981488,
‘httpOnly’: True,
‘name’: ‘BDUSS’,
‘path’: ‘/’,
‘secure’: False,
‘value’: ‘jlhWTBAAAAAAAAF67il5eu4peR’}] # 是个列表,列表里是一个个的字典

屏蔽 windows.navigator.webdriver

options = webdriver.ChromeOptions()

设置为开发者模式,防止被各大网站识别出来使用了Selenium

options.add_experimental_option(‘excludeSwitches’, [‘enable-automation’])

# 不加载图片,加快访问速度

options.add_experimental_option(

“prefs”, {“profile.managed_default_content_settings.images”: 2})

driver = webdriver.Chrome(
executable_path=”/Users/nathaniel/MyApp/lib/seleniumLib/chromedriver”,
options=options)
driver.implicitly_wait(10)
driver.get(“https://www.baidu.com”)

清除所有cookie

driver.delete_all_cookies()
for cookie in cookies:
# 添加 cookie
driver.add_cookie(cookie)

四、简单的 po 模式

from selenium import webdriver

class BaiDuPage:
def init(self, path=None):

来源:酥健一挥

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月1日
下一篇 2020年7月1日

相关推荐