web自动化测试--selenium

发布时间 2023-03-24 15:13:57作者: winnie_B612

1.搭建web自动化测试相关环境

基于python环境搭建

  1. Python 开发环境

  2. 安装selenium包

  3. 安装浏览器

  4. 安装浏览器驱动 -- 保证能够用程序驱动浏览器,实现自动化测试

2.web自动化测试脚本编写的基本步骤

# 导包

from selenium import webdriver

import time

# 创建浏览器驱动对象

driver = webdriver.Firefox()

# driver = webdriver.Chrome()

# driver = webdriver.Edge()

# 加载web页面

driver.get("http://www.baidu.com/")

# 暂停3秒

time.sleep(3)

# 关闭驱动对象

driver.quit()

3.八种元素定位方式

1)元素定位

元素定位就是通过元素的信息或元素层级结构来定位元素的。

2)如何使用浏览器开发者工具

启动

快捷键:一般在windows系统上打开浏览器开发者工具都是按F12

火狐浏览器:在页面上点击右键选择‘查看元素’

谷歌浏览器:在页面上点击右键选择‘检查’

使用

  方法一:在要查看的元素上点击右键选择‘查看元素’或者‘检查’

  方法二:先打开浏览器开发者工具,点击选择元素的图标,移动鼠标到要查看的元素,然后点击

3)元素定位的方式

Selenium提供了八种定位元素方式

  1. id

  2. name

  3. class_name

  4. tag_name

  5. link_text

  6. partial_link_text

  7. XPath

  8. CSS

4)id定位

说明:id定位就是通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的;

前提:元素有id属性

4.1)方法

element = driver.find_element_by_id(id)

4.2)案例

需求:打开注册A.html页面,完成以下操作

  1).使用id定位,输入用户名:admin

  2).使用id定位,输入密码:123456

  3).3秒后关闭浏览器窗口

  1. 导入selenium包 --> from selenium import webdriver

  2. 导入time包 --> import time

  3. 实例化浏览器驱动对象 --> driver = webdriver.Firefox()

  4. 打开注册A.html --> driver.get(url)

  5. 调用id定位方法 --> element = driver.find_element_by_id("")

  6. 使用send_keys()方法输入内容 --> element.send_keys("admin")

  7. 暂停3秒 --> time.sleep(3)

  8. 关闭浏览器驱动对象 --> driver.quit()

说明:为了更好的学习体验,我们先暂时使用下send_keys()方法来输入内容

5)name定位

说明:name定位就是根据元素name属性来定位。HTML文档中name的属性值是可以重复的。

前提:元素有name属性

5.1)方法

element = driver.find_element_by_name(name)

6)Class_name定位

说明:class_name定位就是根据元素class属性来定位。HTML文档中class的属性值是可以重复的。

前提:元素有class属性 ,如果class有多个属性值,只能使用其中的一个

6.1)方法

element = driver.find_element_by_class_name(class_name)

7)tag_name定位

说明:tag_name定位就是根据元素class属性来定位。HTML本质就是由不同的tag组成,每一种标签一般在页面中会存在多个,所以不方便进行精确定位, 一般很少使用

7.1)方法

element = driver.find_element_by_tag_name(tag_name)

如果存在多个相同标签,则返回符合条件的第一个标签

8)Link_text定位

说明:link_text定位是专门用来定位超链接元素(<a>标签</a>),并且是通过超链接的文本内容来定位元素

8.1)方法

element = driver.find_element_by_link_text(link_text)

link_text:为超链接的全部文本内容

9) Partial_Link_text定位

说明:partial_link_text定位是对link_text定位的补充,link_text使用全部文本内容匹配元素,

而partial_link_text可以使用局部来匹配元素,也可以使用全部文本内容匹配元素

9.1)方法

element = driver.find_element_by_partial_link_text(partial_link_text)

partial_link_text:可以传入a标签局部文本-能表达唯一性

10)定位一组元素

10.1)find_elements_by_xxx()

作用:

  1). 查找定位所有符合条件的元素

  2). 返回的定位元素格式为数组(列表)格式;

说明:

1). 列表数据格式的读取需要指定下标(下标从0开始)

案例:

需求:打开注册A.html页面,完成以下操作

1).使用tag_name定位密码输入框(第二个input标签),并输入:123456

2).3秒后关闭浏览器窗口

代码:

driver.find_elements_by_tag_name("input")[1].send_keys("123456")

11)XPath定位

11.1)什么是xpath

  1. XPath即为XML Path的简称,它是一门在 XML 文档中查找元素信息的语言。

  2. HTML可以看做是XML的一种实现,所以Selenium用户可以使用这种强大的语言在Web应用中定位元素。

XML:一种标记语言,用于数据的存储和传递。 后缀.xml结尾

11.2)xpath定位方式

  1. 路径-定位

  2. 利用元素属性-定位

  3. 属性与逻辑结合-定位

  4. 层级与属性结合-定位

方法:element = driver.find_element_by_xpath(xpath)

11.3)路径定位(绝对路径、相对路径)

绝对路径:从最外层元素到指定元素之间所有经过元素层级的路径

  1). 绝对路径以/html根节点开始,使用/来分隔元素层级;

    如:/html/body/div/fieldset/p[1]/input

  2). 绝对路径对页面结构要求比较严格,不建议使用

  相对路径:匹配任意层级的元素,不限制元素的位置

    1). 相对路径以//开始

    2). 格式://input 或者 //*

11.4)利用元素属性

说明:通过使用元素的属性信息来定位元素

格式://input[@id='userA'] 或者 //*[@id='userA']

11.5)属性与逻辑结合

说明:解决元素之间个相同属性重名问题

格式://*[@name='tel' and @class='tel']

11.6)层级与属性结合

说明:如果通过元素自身的信息不方便直接定位到该元素,则可以先定位到其父级元素,然后再找到该元素

格式://*[@id='p1']/input

案例:

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()

url=r'file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8CA.html'

driver.get(url)

#绝对路径xpaths

#driver.find_element_by_xpath('/html/body/form/div/fieldset/p[1]/input').send_keys('123')

#使用层级

#driver.find_element_by_xpath("//p[@id='p1']/input").send_keys('123')

#相对路径xpath

#driver.find_element_by_xpath("//input[@id='passwordA']").send_keys("123")

#逻辑结合

#driver.find_element_by_xpath("//input[@id='passwordA'and@name='passwordA']").send_keys("123")

sleep(3)

driver.quit()

11.7)xpath延伸

//*[text()="xxx"] 文本内容是xxx的元素

//*[contains(@attribute,'xxx')] 属性中含有xxx的元素

//*[starts-with(@attribute,'xxx')] 属性以xxx开头的元素

12)CSS定位

12.1)什么是css定位

  1. CSS(Cascading Style Sheets)是一种语言,它用来描述HTML元素的显示样式;

  2. 在CSS中,选择器是一种模式,用于选择需要添加样式的元素;

  3. 在Selenium中也可以使用这种选择器来定位元素。

提示:

  1. 在selenium中推荐使用CSS定位,因为它比XPath定位速度要快

  2. css选择器语法非常强大

12.2)方法

element = driver.find_element_by_css_selector(css_selector)

12.3)CSS定位常用策略

  1. id选择器

  2. class选择器

  3. 元素选择器

  4. 属性选择器

  5. 层级选择器

12.4) id选择器

说明:根据元素id属性来选择

格式:#id

例如:#userA <选择id属性值为userA的元素>

driver.find_element_by_css_selector('#userA').send_keys('admin')

12.5)calss选择器

说明:根据元素class属性来选择

格式:.class

例如:.telA <选择class属性值为telA的所有元素>

driver.find_element_by_css_selector('.telA').send_keys('15601021091')

12.6)元素选择器

说明:根据元素的标签名选择

格式:element

例如:input <选择所有input元素>

span = driver.find_element_by_css_selector("span").text

print(span)

12.7)属性选择器

说明:根据元素的属性名和值来选择

格式:[attribute=value] element[attribute=value]

例如:[type="password"] <选择type属性值为password的元素>

driver.find_element_by_css_selector(“[name='passwordA']").send_keys('123456')

12.8)层级选择器

说明:根据元素的父子关系来选择

格式1:element1>element2 通过element1来定位element2,并且element2必须为element1的直接子元素

例如1:p[id='p1']>input <定位指定p元素下的直接子元素input>

格式2:element1 element2 通过element1来定位element2,并且element2为element1的后代元素

例如2:p[id='p1'] input <定位指定p元素下的后代元素input>

driver.find_element_by_css_selector("p>input[id='emailA']").send_keys('123@qq.com')

12.9)css延伸

input[type^='p'] type属性以p字母开头的元素

input[type$='d'] type属性以d字母结束的元素

input[type*='w'] type属性包含w字母的元素

13)总结

  1. id、name、class_name:为元素属性定位

  2. tag_name:为元素标签名称

  3. link_text、partial_link_text:为超链接定位(a标签)

  4. XPath:为元素路径定位

  5. CSS:为CSS选择器定位

14)扩展

方法:find_element(by=By.ID, value=None)

备注:需要两个参数,第一个参数为定位的类型由By提供,第二个参数为定位的具体方式

示例:

  1. driver.find_element(By.CSS_SELECTOR, '#emailA').send_keys("123@126.com")

  2. driver.find_element(By.XPATH, '//*[@id="emailA"]').send_keys('234@qq.com')

  3. driver.find_element(By.ID, "userA").send_keys("admin")

  4. driver.find_element(By.NAME, "passwordA").send_keys("123456")

  5. driver.find_element(By.CLASS_NAME, "telA").send_keys("18611111111")

  6. driver.find_element(By.TAG_NAME, 'input').send_keys("123")

  7. driver.find_element(By.LINK_TEXT, '访问 新浪 网站').click()

  8. driver.find_element(By.PARTIAL_LINK_TEXT, '访问').click()

from selenium import webdriver

from time import sleep

from selenium.webdriver.common.by import By

 

driver = webdriver.Chrome()

url = "http://www.tpshop.com/index.php"

driver.get(url)

driver.find_element(By.CSS_SELECTOR,'.red').click()

driver.quit()

14.1)导入By类

导包:from selenium.webdriver.common.by import By

class By(object):

"""

Set of supported locator strategies.

"""

ID = "id"

XPATH = "xpath"

LINK_TEXT = "link text"

PARTIAL_LINK_TEXT = "partial link text"

NAME = "name"

TAG_NAME = "tag name"

CLASS_NAME = "class name"

CSS_SELECTOR = "css selector"

4.对元素和浏览器的操作方法

1)元素常用的操作方法

  1. click() 单击元素

  2. send_keys(value) 模拟输入

  3. clear() 清除文本

2)案例

需求:打开注册A页面,完成以下操作

  1) .通过脚本执行输入用户名:admin;密码:123456;电话号码:18611111111;电子邮件:123@qq.com

  2)  间隔3秒,修改电话号码为:18600000000

  3) 间隔3秒,点击‘注册’按钮

  4) 间隔3秒,关闭浏览器

  5) 元素定位方法不限

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()

url='file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8CA.html'

driver.get(url)

driver.find_element_by_css_selector('#userA').send_keys('admin')

driver.find_element_by_css_selector('#passwordA').send_keys('18210438231')

driver.find_element_by_css_selector('.telA').send_keys('18210422222')

driver.find_element_by_css_selector('#emailA').send_keys('123@qq.com')

sleep(3)

driver.find_element_by_css_selector('.telA').clear()

driver.find_element_by_css_selector('.telA').send_keys('18900033333')

sleep(3)

driver.find_element_by_css_selector('button').click()

sleep(3)

driver.quit()

3)操作浏览器常用的方法

  1. maximize_window() 最大化浏览器窗口 --> 模拟浏览器最大化按钮

  2. set_window_size(width, height) 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)

  3. set_window_position(x, y) 设置浏览器窗口位置 --> 设置浏览器位置

  4. back() 后退 --> 模拟浏览器后退按钮

  5. forward() 前进 --> 模拟浏览器前进按钮

  6. refresh() 刷新 --> 模拟浏览器F5刷新

  7. close() 关闭当前窗口 --> 模拟点击浏览器关闭按钮

  8. quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口

  9. title 获取页面title

  10. current_url 获取当前页面URL

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()

url = 'file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8CA.html'

driver.get(url)

# 最大化浏览器

driver.maximize_window()

# 刷新

driver.refresh()

# 后退

driver.back()

# 前进

driver.forward()

# 设置浏览器大小

driver.set_window_size(300,300)

# 设置浏览器位置

driver.set_window_position(300,200)

# 关闭浏览器单个窗口

driver.close()

# 关闭浏览器所有窗口

driver.quit()

# 获取title

title = driver.title

# 获取当前页面url

url = driver.current_url

4)获取元素信息常用方法

  1. size 返回元素大小

  2. text 获取元素的文本

  3. get_attribute("xxx") 获取属性值,传递的参数为元素的属性名

  4. is_displayed() 判断元素是否可见

  5. is_enabled() 判断元素是否可用

  6. is_selected() 判断元素是否选中,用来检查复选框或单选按钮是否被选中

提示:

  1. size、text:为属性,调用时无括号;如:xxx.size

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()

url="file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8CA.html"

driver.get(url)

size = driver.find_element_by_css_selector("#userA").size

print(size)

#获取超链接内容

text = driver.find_element_by_css_selector("#fwA").text

print(text)

#获取页面上第一个超文本链接地址

att = driver.find_element_by_css_selector("a").get_attribute("href")

print(att)

#判断span元素是否可见

display = driver.find_element_by_css_selector("span").is_displayed()

print(display)

#判断取消按钮是否可用

enable = driver.find_element_by_css_selector("#cancelA").is_enabled()

print(enable)

#判断旅游是否被选中

select = driver.find_element_by_css_selector("#lyA").is_selected()

print(select)

sleep(3)

driver.quit()

5.键盘鼠标的操作

1)鼠标操作的方法

说明:在Selenium中将操作鼠标的方法封装在ActionChains类中

实例化对象:

action = ActionChains(driver)

方法:

  1. context_click(element) 右击 --> 模拟鼠标右键点击效果

  2. double_click(element) 双击 --> 模拟鼠标双击效果

  3. drag_and_drop(source, target) 拖动 --> 模拟鼠标拖动效果

  4. move_to_element(element) 悬停 --> 模拟鼠标悬停效果

  5. perform() 执行 --> 此方法用来执行以上所有鼠标操作

为了更好的学习其他方法,我们先学习perform()执行方法,因为所有的方法都需要执行才能生效

from selenium import webdriver

from time import sleep

#获取浏览器驱动对象

from selenium.webdriver.common.action_chains import ActionChain

driver = webdriver.Chrome()

url="file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8CA.html"

driver.get(url)

#实例化对象

action = ActionChains(driver)

#执行右击方法

username= driver.find_element_by_css_selector("#userA")

action.context_click(username).perform()

sleep(2)

#执行双击

pwd=driver.find_element_by_css_selector("#passwordA")

pwd.send_keys("password")

action.double_click(pwd).perform()

sleep(2)

#移动到按钮上

action.move_to_element(driver.find_element_by_css_selector("button")).perform()

sleep(2)

driver.quit()

2)鼠标执行perform()

说明:在ActionChains类中所有提供的鼠标事件方法,在调用的时候所有的行为都存储在ActionChains对象中,而perform()方法就是真正去执行所有的鼠标事件。

强调:必须调用perform()方法才能执行鼠标事件

2)鼠标右击context_click(element) 右击

说明:对于点击鼠标右键,如果弹出的是浏览器默认的菜单,Selenium没有提供操作菜单选项的方法;

如果是自定义的右键菜单,则可以通过元素定位来操作菜单中的选项。

案例:需求:打开注册页面A,在用户名文本框上点击鼠标右键

  1. 导包:from selenium.webdriver.common.action_chains import ActionChains

  2. 实例化ActionChains对象:action = ActionChains(driver)

  3. 调用右键方法:action.context_click(element)

  4. 执行:action.perform()

3)鼠标双击

说明:模拟双击鼠标左键操作

4)鼠标拖动

说明:模拟鼠标拖动动作,选定拖动源元素释放到目标元素

  1. 源元素 source = driver.find_element_by_id(xxx)

  2. 目标元素 target = driver.find_element_by_id(xxx)

  3. 调用方法 action.drag_and_drop(source, target).perform()

5)鼠标悬停

说明: 模拟鼠标悬停在指定的的元素上

from selenium import webdriver

from time import sleep

#获取浏览器驱动对象

from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()

url = "file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/drop.html"

driver.get(url)

#实例化对象

action = ActionChains(driver)

#原目标

source = driver.find_element_by_css_selector("#div1")

target = driver.find_element_by_css_selector("#div2")

sleep(2)

#目标执行

#action.drag_and_drop(source,target).perform()

#扩展,通过偏移量执行

action.drag_and_drop_by_offset(source,xoffset=360,yoffset=180).perform()

sleep(2)

driver.quit()

6)键盘操作

说明:

  1). 模拟键盘上一些按键或者组合键的输入 如:Ctrl+C 、Ctrl+V;

  2). Selenium中把键盘的按键都封装在Keys类中

    导包:from selenium.webdriver.common.keys import Keys

7)常用的键盘操作

  1. send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

  2. send_keys(Keys.SPACE) 空格键(Space)

  3. send_keys(Keys.TAB) 制表键(Tab)

  4. send_keys(Keys.ESCAPE) 回退键(Esc)

  5. send_keys(Keys.ENTER) 回车键(Enter)

  6. send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)

  7. send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

from selenium import webdriver

from time import sleep

#获取键盘对象

from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()

url='file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8CA.html'

driver.get(url)

username = driver.find_element_by_css_selector("#userA")

username.send_keys("admin1")

sleep(2)

#删除1

username.send_keys(Keys.BACK_SPACE)

sleep(2)

#全选admin ctrl+a

username.send_keys(Keys.CONTROL,"a")

sleep(2)

#复制Ctrl+c

username.send_keys(Keys.CONTROL,"c")

sleep(2)

#定位密码框,执行ctrl+v

driver.find_element_by_css_selector("#passwordA").send_keys(Keys.CONTROL,"v")

sleep(2)

driver.quit()

6.元素等待

1)什么是元素等待

概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程

2)元素等待的类型

  1. 显式等待
  2. 隐式等待

3)隐式等待

概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException 。

实现方式

方法:driver.implicitly_wait(timeout)

(timeout:为等待最大时长,单位:秒)

说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)

4)显式等待

概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出超时异常 TimeoutException

实现方法:

  1. 导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait

  2. WebDriverWait(driver, timeout, poll_frequency=0.5)

    1). driver:浏览器驱动对象

    2). timeout:超时的时长,单位:秒

    3). poll_frequency:检测间隔时间,默认为0.5秒

  3. 调用方法 until(method):直到...时

    1). method:函数名称,该函数用来实现对元素的定位

    2). 一般使用匿名函数来实现:lambda x: x.find_element_by_id("userA")

  4. element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA") )

案例:

需求:打开注册A页面,完成以下操作

1).使用显式等待定位用户名输入框,如果元素存在,就输入admin

import time

from selenium import webdriver

from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()

driver.get("file:///D:/webAutoTest/page/注册A.html")

element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA"))

element.send_keys("admin")

time.sleep(3)

driver.quit()

5)显式等待和隐式等待的区别

  1. 作用域:隐式为全局元素,显式等待为单个元素有效

  2. 使用方法:隐式等待直接通过驱动对象调用,而显式等待方法封装在WebDriverWait类中

  3. 达到最大超时时长后抛出的异常不同:隐式为NoSuchElementException,显式等待为TimeoutException

7.下拉框、警告框和滚动条的操作

1)下拉框操作

Select类是Selenium为操作select标签特殊封装的。 实例化对象: select = Select(element) element: 标签对应的元素,通过元素定位方式获取, 例如:driver.find_element_by_id(“selectA”)

操作方法:

    select_by_index(index) --> 根据option索引来定位,从0开始

    select_by_value(value) --> 根据option属性 value值来定位

    select_by_visible_text(text) --> 根据option显示文本来定位

案例:

from selenium import webdriver

from time import sleep

from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()

driver.maximize_window()

driver.implicitly_wait(30)

url='file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8CA.html'

driver.get(url)

e1=driver.find_element_by_css_selector("#selectA")

sleep(2)

"""通过下标"""

#切换上海

# Select(e1).select_by_index(1)

# sleep(2)

# Select(e1).select_by_index(2)

 

"""通过value值"""

# sel = Select(e1)

# sel.select_by_value("sh")

# sleep(2)

# sel.select_by_value("gz")

 

"""通过显示文本切换"""

Select(e1).select_by_visible_text("A上海")

sleep(2)

Select(e1).select_by_visible_text("A广州")

sleep(2)

driver.quit()

2)弹出框处理

网页中常用的弹出框有三种

  1. alert 警告框

  2. confirm 确认框

  3. prompt 提示框

说明:Selenium中对处理弹出框的操作,有专用的处理方法;并且处理的方法都一样

  1. 获取弹出框对象

    alert = driver.switch_to.alert

  2. 调用

    alert.text --> 返回alert/confirm/prompt中的文字信息

    alert.accept() --> 接受对话框选项

    alert.dismiss() --> 取消对话框选项

# 定位alerta按钮

driver.find_element_by_id("alerta").click()

# 获取警告框

alert = driver.switch_to.alert

# 打印警告框文本

print(alert.text)

# 接受警告框

alert.accept()

# 取消警告框

# alert.dismiss()

3)滚动条操作

实现方式

说明:selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本

的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。

  1. 设置JavaScript脚本控制滚动条

    js = "window.scrollTo(0,1000)"

    (0:左边距;1000:上边距;单位像素)

  2. selenium调用执行JavaScript脚本的方法

    driver.execute_script(js)

# 最底层

js1 = "window.scrollTo(0,10000)"

driver.execute_script(js1)

# 最顶层

js2 = "window.scrollTo(0,0)"

driver.execute_script(js2)

8.如何切换frame框架和多窗口

1)frame切换方法

说明:在Selenium中封装了如何切换frame框架的方法

方法:

  1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法

    frame_reference:可以为frame框架的name、id或者定位到的frame元素

  2). driver.switch_to.default_content() --> 恢复默认页面方法

    在frame中操作其他页面,必须先回到默认页面,才能进一步操作

2)多窗口切换

说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;

句柄:英文handle,窗口的唯一识别码

方法:

  1). driver.current_window_handle --> 获取当前窗口句柄

  2). driver.window_handles --> 获取所有窗口句柄

  3). driver.switch_to.window(handle) --> 切换指定句柄窗口

案例:

from selenium import webdriver

from time import sleep

from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()

url="file:///C:/Users/sgd_user/Desktop/driver/cailiaoeg/%E6%B3%A8%E5%86%8C%E5%AE%9E%E4%BE%8B.html"

driver.get(url)

driver.maximize_window()

driver.implicitly_wait(5)

handle = driver.current_window_handle

print(handle)

driver.find_element_by_css_selector("#ZCA").click()

hanles = driver.window_handles

for h in hanles:

    if h != handle:

        #切换

        driver.switch_to.window(h)

driver.find_element_by_css_selector("#userA").send_keys("admin")

sleep(2)

driver.quit()

9.如何实现窗口截图和验证码

1)窗口截图

说明:在Selenium中,提供了截图方法,我们只需要调用即可

方法:

driver.get_screenshot_as_file(imgpath)

imgpath:图片保存路径

案例:

driver.find_element_by_id("userA").send_keys("admin")

driver.get_screenshot_as_file("./img/img01.jpg")

2)验证码

说明:Selenium中并没有对验证码处理的方法方式

方式:

  1). 去掉验证码

    (测试环境下-采用)

  2). 设置万能验证码

    (生产环境和测试环境下-采用)

  3). 验证码识别技术

    (通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)

  4). 记录cookie

    (通过记录cookie进行跳过登录)

3)cookie是什么?

  1. Cookie是由Web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。

  2. Cookie数据格式:键值对组成(python中的字典)

  3. Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie数据

  4. Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。

4)selenium操作cookie

说明:Selenium中对cookie操作提供相应的方法

方法:

  1. get_cookie(name) --> 获取指定cookie

    name:cookie的名称

  2. get_cookies() --> 获取本网站所有本地cookies

  3. add_cookie(cookie_dict) --> 添加cookie

    cookie_dict:一个字典对象,必选的键包括:"name" and "value"

案例:

需求:使用cookie实现跳过登录

1). 手动登录百度,获取cookie

2). 使用获取到的cookie,达到登录目的,然后就可以执行登录之后的操作

from selenium import webdriver

import time

driver = webdriver.Firefox()

driver.get("https://www.baidu.com")

driver.add_cookie({'name':'BDUSS','value':'根据实际填写'})

time.sleep(3)

driver.refresh()

time.sleep(3)

driver.quit()