自动化测试之————selenium框架

selenium的使用



一、自动化测试

1.1 认识自动化测试

让程序或工具代替人为对程序功能验证的过程

1.2 自动化适用场景

  1. 回归测试
  2. 压力测试
  3. 兼容性(1. 浏览器、2. 分辨率 3. 操作系统)

1.3 自动化测试优点

  1. 在最短时间内运行最多的bug
  2. 脚本重复运行
  3. 减少人为错误
  4. 克服手工测试局限性(图片大小)

1.4 自动化测试误区

  1. 自动化测试比手工厉害
  2. 自动化测试比手工发现更多bug
  3. 自动化测试可以完全替代手工测试
  4. 软件所有功能都适合自动化测试

1.5 自动化测试分类

  1. Web自动化测试
  2. 移动自动化测试(app自动化)
  3. 接口自动化(工具、代码)
  4. 单元测试

1.6 selenium的特点

  1. 开源、免费
  2. 跨平台(Linux windows mac)
  3. 支持多浏览器:谷歌 火狐 IE
  4. 支持多语言:python、java…等等
  5. 成熟稳定:已经被 谷歌、百度大型公司广泛使用
  6. 功能强大:支持商业化大部分功能,并且由于开源,可以定制化需求功能

1.7 selenium安装

通过pip包管理工具去安装
安装:

pip install selenium

查看:

pip show selenium

卸载:

pip uninstall selenium

扩展:
1. 安装指定版本 pip install selenium版本号 如:pip install selenium2.48.0
2. 如何查看可安装按本? 指定版本号为错误版本号
3. pip是python中包管理工具(可以安装,卸载、查看python工具)
4. pip list:查看通过pip包管理工具安装的插件或工具

1.8 浏览器及驱动安装

浏览器
火狐:可以官网或百度获取浏览器版本
谷歌:通过百度

驱动:
1. 火狐:https://github.com/mozilla/geckodriver/releases/
2. 谷歌:http://chromedriver.storage.googleapis.com/index.html

应用:

  • 将浏览器驱动放到指定文件夹
  • 将浏览器驱动所在目录添加到系统path环境变量中(选中我的电脑/此电脑-右键–>属性–>高级系统设置–>高级(环境变量)–>path(如果是wind7路径与路径之间需要添加分号))

注意:

  1. 浏览器驱动必须和浏览器版本对应(查看下载驱动时,有告知响应的浏览器版本)
  2. 获取浏览器48版本以下,内置驱动

1.9 第一个案例

# 导包 
		from selenium import webdriver
		from time import sleep
		
		# 获取浏览器驱动
		driver = webdriver.Chrome()
		# 打开url
		driver.get("http://www.baidu.com")
		# 暂停3秒
		sleep(3)
		# 关闭浏览器驱动
		driver.quit()

二、slenium元素定位

2.1 id定位

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

element = driver.find_element_by_id(id)
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 通过id定位并获取元素文本
element = driver.find_element_by_id("my_element")
text = element.text
print("元素的文本是:", text)

# 通过id定位并点击按钮
button = driver.find_element_by_id("my_button")
button.click()

driver.quit()
  • 这个示例中,我们使用driver.find_element_by_id方法来定位具有特定id的元素,如"my_element"和"my_button"
  • 然后,我们使用定位到的元素进行后续操作,比如获取文本内容或点击按钮

2.2 name定位

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

element = driver.find_element_by_name(name)
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 通过name属性定位并获取元素文本
element = driver.find_element_by_name("username")
text = element.text
print("元素的文本是:", text)

# 通过name属性定位并输入文本
input_box = driver.find_element_by_name("q")
input_box.send_keys("Selenium")

# 通过name属性定位并点击按钮
button = driver.find_element_by_name("submit")
button.click()

driver.quit()
  • 在这个示例中,我们使用driver.find_element_by_name方法来定位具有特定name属性的元素,如"username",“q"和"submit”
  • 然后,我们可以使用这些定位到的元素进行各种操作,如获取文本内容、输入文本或点击按钮等

2.3 class_name定位

说明:class_name定位就是根据元素class属性值来定位元素。HTML通过使用class来定义元素的样式
前提:元素有class属性
注意:如果class有多个属性值,只能使用其中的一个

element = driver.find_element_by_class_name(class_name)
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 通过class属性定位并获取元素文本
element = driver.find_element_by_class_name("my_class")
text = element.text
print("元素的文本是:", text)

# 通过class属性定位并点击按钮
button = driver.find_element_by_class_name("my_button")
button.click()

driver.quit()
  • 在这个示例中,我们使用driver.find_element_by_class_name方法来定位具有特定class属性的元素,如"my_class"和"my_button"
  • 然后,我们可以使用这些定位到的元素进行各种操作,如获取文本内容或点击按钮等

2.4 tag_name(标签名定位)

是通过元素的标签名称来定位,标签名(查看元素时尖括号(<)紧挨着的单词或字母就是标签名)

driver.find_element_by_tag_name("标签名")
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 找到第一个 <a> 标签并获取其属性值
element = driver.find_element_by_tag_name("a")
href = element.get_attribute("href")
print("第一个<a>标签的链接地址是:", href)

# 找到所有的 <input> 标签并遍历输出它们的值
elements = driver.find_elements_by_tag_name("input")
print("页面中的输入框数量:", len(elements))
for element in elements:
    value = element.get_attribute("value")
    print("输入框的值:", value)

driver.quit()
  • 此案例先使用find_element_by_tag_name方法找到页面上第一个 < a >标签,并获取其href属性值
  • 然后使用find_elements_by_tag_name方法找到所有的标签,并输出它们的值

注意:
如果页面中存在多个相同标签,默认返回第一个标签元素

2.5 link_text (链接文本定位)

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

element = driver.find_element_by_link_text(link_text)
link_text:为超链接的全部文本内容
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 通过链接文本定位并点击链接
link = driver.find_element_by_link_text("More information...")
link.click()

# 获取新页面的标题
new_page_title = driver.title
print("新页面的标题是:", new_page_title)

driver.quit()
  • 在此案例中,我们使用find_element_by_link_text方法来定位页面上的链接文本为"More information…"的链接
  • 并使用click方法点击该链接。然后,我们使用title属性获取新页面的标题,并输出它

2.6 partial_link_text(部分链接文本定位)

partial_link_text定位是对link_text定位的补充,link_text使用全部文本内容匹配元素
而partial_link_text可以使用局部来匹配元素,也可以使用全部文本内容匹配元素

element = driver.find_element_by_partial_link_text(partial_link_text)
partial_link_text:可以传入a标签局部文本-能表达唯一性
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 通过部分链接文本定位并点击链接
partial_link = driver.find_element_by_partial_link_text("More")
partial_link.click()

# 获取新页面的标题
new_page_title = driver.title
print("新页面的标题是:", new_page_title)

driver.quit()
  • 在这个案例中,我们使用find_element_by_partial_link_text方法来定位部分链接文本包含"More"的链接
  • 并使用click方法点击该链接。然后,我们使用title属性获取新页面的标题,并输出它

2.7 Xpath定位

xpath是XML Path简称;
(xml是一种标记语言,焦点:数据存储于传递(配置文件) 后缀.XML)

常用的定位策略:

1.路径

1). 绝对路径:
语法:以单斜杠开头逐级开始编写,不能跳级。如:/html/body/div/p[1]/input
2). 相对路径
语法:以双斜杠开头,双斜杠后边跟元素名称,不知元素名称可以使用*代替。
如: //input 与 // *

  1. 路径结合属性
    语法:在Xpath中,所有的属性必须使用@符号修饰 如://*[@id=‘id值’]
  2. 路径结合逻辑(多个属性)
    语法://*[@id=“id值” and @属性=‘属性值’]
  3. 路径结合层级
    语法://*[@id=‘父级id属性值’]/input
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 通过XPath定位并获取元素文本
element = driver.find_element_by_xpath("//h1")
text = element.text
print("h1标签的文本是:", text)

# 通过XPath定位并点击按钮
button = driver.find_element_by_xpath("//button[@id='my_button']")
button.click()

driver.quit()
  • 在此案例中,我们使用find_element_by_xpath方法通过XPath来定位元素。第一个例子中,我们使用XPath //h1 定位第一个< h1>标签,并获取其文本内容
  • 第二个例子中,我们使用XPath //button[@id=‘my_button’] 定位id属性为my_button的按钮,并使用click方法点击它

拓展:

  1. //*[text()=‘XXX’] # 定位文本值等于XXX的元素
    提示:一般适合 p标签,a标签
  2. //*[contains(@属性,‘xxx’)] # 定位属性包含xxx的元素
    提示:contains为关键字,不可更改
  3. //*[starts-with(@属性,‘xxx’)] # 定位属性以xxx开头的元素
    提示:starts-with为关键字,不可更改

2.8 CSS定位

  1. CSS一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须先找到元素,在css标记语言中找元素使用css选择器
  2. css定位就是通过css选择器工具进行定位
  3. 极力推荐使用,查找元素的效率比xpath高,语法比xpath更简单
driver.find_element_by_css_selector()

常见的定位策略:

  1. id 选择器
    前提:元素是必须有id属性
    语法:#id 如:#passwordA
  2. class 选择器
    前提:元素是必须有class属性
    语法:.class 如:.telA
  3. 元素选择器
    语法:element 如:input
  4. 属性选择器
    语法:[属性名=属性值]
  5. 层级选择器
    语法:
    1. p>input
    2. p input

扩展:
1. [属性^=‘开头的字母’] # 获取指定属性以指定字母开头的元素
2. [属性$=‘结束的字母’] # 获取指定属性以指定字母结束的元素
3. [属性*=‘包含的字母’] # 获取指定属性包含指定字母的元素

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 通过CSS选择器定位并获取元素文本
element = driver.find_element_by_css_selector("h1")
text = element.text
print("h1标签的文本是:", text)

# 通过CSS选择器定位并点击按钮
button = driver.find_element_by_css_selector("#my_button")
button.click()

driver.quit()
  • 在这个案例中,我们使用find_element_by_css_selector方法来定位元素
  • 第一个例子中,我们使用CSS选择器 “h1” 定位第一个 < h1> 标签,并获取其文本内容
  • 第二个例子中,我们使用CSS选择器 “#my_button” 定位id属性为my_button的按钮,并使用click方法点击它

三、元素操作、浏览器操作方法

3.1 元素常用操作方法

  1. click() 单击元素
  2. send_keys(value) 模拟输入
  3. clear() 清除文本

单击元素

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 单击按钮
button = driver.find_element_by_id("my_button")
button.click()

driver.quit()

模拟输入

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 模拟输入文本
input_box = driver.find_element_by_name("q")
input_box.send_keys("Selenium")

driver.quit()

清除文本

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 清除文本内容
input_box = driver.find_element_by_id("my_input")
input_box.clear()

driver.quit()

综合案例

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 单击按钮
button = driver.find_element_by_id("my_button")
button.click()

# 模拟输入文本
input_box = driver.find_element_by_name("q")
input_box.send_keys("Selenium")

# 清除文本内容
input_box = driver.find_element_by_id("my_input")
input_box.clear()

driver.quit()

3.2 浏览器操作

  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
# 最大化浏览器
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

3.3 获取元素信息

  1. size 返回元素大小
  2. text 获取元素的文本
  3. get_attribute(“xxx”) 获取属性值,传递的参数为元素的属性名
  4. is_displayed() 判断元素是否可见
  5. is_enabled() 判断元素是否可用
  6. is_selected() 判断元素是否选中,用来检查复选框或单选按钮是否被选中
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 获取按钮的文本内容
button = driver.find_element_by_id("my_button")
button_text = button.text
print("按钮的文本是:", button_text)

# 获取输入框的大小
input_box = driver.find_element_by_name("q")
input_box_size = input_box.size
print("输入框的尺寸是:", input_box_size)

# 获取链接的href属性
link = driver.find_element_by_link_text("Learn More")
link_href = link.get_attribute("href")
print("链接的href属性是:", link_href)

# 判断文本是否可见
text = driver.find_element_by_id("my_text")
is_visible = text.is_displayed()
print("文本是否可见:", is_visible)

# 判断按钮是否可用
is_enabled = button.is_enabled()
print("按钮是否可用:", is_enabled)

# 判断复选框是否选中
checkbox = driver.find_element_by_id("my_checkbox")
is_selected = checkbox.is_selected()
print("复选框是否选中:", is_selected)

driver.quit()

四、鼠标和键盘操作

4.1 鼠标操作

常见的鼠标操作有:点击、右击、双击、悬停、拖拽等,对于这些鼠标操作Selenium都封装了相
应的操作方法

4.2 为什么要操作鼠标

现在Web产品中存在丰富的鼠标交互方式,作为一个Web自动化测试框架,需要应对这些鼠标操
作的应用场景

4.3 鼠标操作的方法

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

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

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

  1. context_click(element) 右击 --> 模拟鼠标右键点击效果
  2. double_click(element) 双击 --> 模拟鼠标双击效果
  3. drag_and_drop(source, target) 拖动 --> 模拟鼠标拖动效果
  4. move_to_element(element) 悬停 --> 模拟鼠标悬停效果
  5. perform() 执行 --> 此方法用来执行以上所有鼠标操作

4.4 鼠标右键-context_click()

对于点击鼠标右键,如果弹出的是浏览器默认的菜单,Selenium没有提供操作菜单选项的方法;
如果是自定义的右键菜单,则可以通过元素定位来操作菜单中的选项

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://example.com")

element = driver.find_element_by_id("my_element")

action = ActionChains(driver)
action.context_click(element).perform()

driver.quit()

4.5 鼠标双击-double_click()

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://example.com")

element = driver.find_element_by_id("my_element")

action = ActionChains(driver)
action.double_click(element).perform()

driver.quit()

4.6 鼠标拖动-drag_and_drop()

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

  1. 源元素 source = driver.find_element_by_id(xxx)
  2. 目标元素 target = driver.find_element_by_id(xxx)
  3. 调用方法 action.drag_and_drop(source, target).perform()
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://example.com")

# 定位源元素和目标元素
source_element = driver.find_element_by_id("source_element")
target_element = driver.find_element_by_id("target_element")

# 进行拖拽操作
action = ActionChains(driver)
action.drag_and_drop(source_element, target_element).perform()

driver.quit()
  • 在这个案例中,我们使用了driver.find_element_by_id()方法分别定位源元素和目标元素
  • 然后,我们创建一个ActionChains对象,并调用drag_and_drop()方法来执行拖拽动作
  • 将源元素拖拽到目标元素位置
  • 最后,使用perform()方法来执行所有的鼠标动作

4.7 鼠标悬停-move_to_element()

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

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://example.com")

# 定位要悬停的元素
element = driver.find_element_by_id("my_element")

# 鼠标悬停操作
action = ActionChains(driver)
action.move_to_element(element).perform()

driver.quit()

4.8 键盘操作

1). 模拟键盘上一些按键或者组合键的输入 如:Ctrl+C 、Ctrl+V;
2). Selenium中把键盘的按键都封装在Keys类中

4.9 Key类

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

4.10 常见的键盘操作

  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)

4.11 键盘案例

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://example.com")

# 定位文本框元素
text_box = driver.find_element_by_id("my_textbox")

# 在文本框中输入文字
text_box.send_keys("Hello World!")

# 删除最后一个字符
text_box.send_keys(Keys.BACK_SPACE)

# 输入一个空格
text_box.send_keys(Keys.SPACE)

# 输入制表符
text_box.send_keys(Keys.TAB)

# 模拟按下回退键
text_box.send_keys(Keys.ESCAPE)

# 模拟按下回车键
text_box.send_keys(Keys.ENTER)

# 模拟按下Ctrl+A全选文本
text_box.send_keys(Keys.CONTROL, "a")

# 模拟按下Ctrl+C复制文本
text_box.send_keys(Keys.CONTROL, "c")

driver.quit()

五、元素等待

5.1 什么是元素等待

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

5.2 为什么要设置元素等待

  1. 网络速度慢
  2. 电脑配置低
  3. 服务器处理请求慢

5.3 元素等待类型

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

5.4 隐式等待

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

方法:
driver.implicitly_wait(timeout)
(timeout:为等待最大时长,单位:秒)

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

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # 设置隐式等待时间为10秒

driver.get("http://example.com")

element = driver.find_element_by_id("my_element")

driver.quit()

5.5 显式等待

概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该
元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出超
时异常 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”)
    )
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.Chrome()
driver.get("http://example.com")

# 设置等待条件,直到元素可被点击
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "my_element")))

# 执行后续操作
element.click()

driver.quit()

5.6 显式与隐式区别

  1. 作用域:隐式为全局元素,显式等待为单个元素有效
  2. 使用方法:隐式等待直接通过驱动对象调用,而显式等待方法封装在WebDriverWait类中
  3. 达到最大超时时长后抛出的异常不同:隐式为NoSuchElementException,显式等待为TimeoutException

六、下拉选择框

1、为什么单独使用下拉框?

  1. 如果option选项没有value值的化,css定位或其他定位就不太方便

2、使用Select类
实例化对象:
select = Select(element)
element: 标签对应的元素,通过元素定位方式获取,
例如:driver.find_element_by_id(“selectA”)

3、操作方法:

  1. select_by_index(index) --> 根据option索引来定位,从0开始
  2. select_by_value(value) --> 根据option属性 value值来定位
  3. select_by_visible_text(text) --> 根据option显示文本来定位

步骤:

1. 导包 Select类 --> from selenium.webdriver.support.select import Select
2. 实例化Select类 select = Select(driver.find_element_by_id("selectA"))
3. 调用方法:select.select_by_index(index)
from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome()
driver.get("http://example.com")

# 定位下拉框元素
select_element = driver.find_element_by_id("my_select")

# 创建Select对象
select = Select(select_element)

# 通过索引选择选项,索引从0开始
select.select_by_index(1)

# 通过可见文本选择选项
select.select_by_visible_text("Option 2")

# 通过值选择选项
select.select_by_value("option2")

driver.quit()

七、弹出框

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

  1. alert 警告框
  2. confirm 确认框
  3. prompt 提示框

弹出框处理方法:

  1. 获取弹出框对象
    alert = driver.switch_to.alert
  2. 调用
    alert.text --> 返回alert/confirm/prompt中的文字信息
    alert.accept() --> 接受对话框选项
    alert.dismiss() --> 取消对话框选项
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 点击触发弹出框的按钮
button = driver.find_element_by_id("my_button")
button.click()

# 切换到弹出框
alert = driver.switch_to.alert

# 获取弹出框中的文本信息
message = alert.text
print("弹出框信息:", message)

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

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

driver.quit()

八、滚动条操作

滚动条:一种可控制页面显示范围的组件

  1. 在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载
  2. 页面注册同意条款,需要滚动条到最底层,才能点击同意

实现方式:

  1. 设置JavaScript脚本控制滚动条
    js = “window.scrollTo(0,1000)”
    (0:左边距;1000:上边距;单位像素)
  2. selenium调用执行JavaScript脚本的方法
    driver.execute_script(js)
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 使用JavaScript脚本控制滚动条
js_script = "window.scrollTo(0, 1000)"
driver.execute_script(js_script)

driver.quit()

九、frame切换、多窗口切换

9.1 frame切换

1、应用场景:

处于frame 中的元素,虽然可以获取元素信息,但是代码执行时无法定位元素,因此需要先切换到frame,再进行元素定位操作

方法:
1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法
frame_reference:可以为frame框架的name、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢复默认页面方法

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

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 切换到frame
frame_element = driver.find_element_by_id("frame_id")
driver.switch_to.frame(frame_element)

# 在frame中执行操作
# ...

# 返回默认的上下文(默认的frame)
driver.switch_to.default_content()

driver.quit()

9.2 多窗口切换

在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面

方法:

1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 获取当前窗口句柄
current_window = driver.current_window_handle
print("当前窗口句柄:", current_window)

# 打开新窗口
driver.execute_script("window.open('http://example.com')")

# 获取所有窗口句柄
window_handles = driver.window_handles
print("所有窗口句柄:", window_handles)

# 切换到新的窗口
for handle in window_handles:
    if handle != current_window:
        driver.switch_to.window(handle)
        break

# 在新窗口中执行操作
# ...

# 关闭当前窗口并切换回原始窗口
driver.close()
driver.switch_to.window(current_window)

driver.quit()

十、窗口截图、验证码处理

10.1 窗口截图

说明:把当前操作的页面,截图保存到指定位置

10.2 为什么要窗口截图

自动化脚本是由程序去执行的,因此有时候打印的错误信息并不是十分明确。如果在执行出错的时候
对当前窗口截图保存,那么通过图片就可以非常直观地看到出错的原因

10.3 窗口截图的方法

说明:在Selenium中,提供了截图方法,我们只需要调用即可
方法:
driver.get_screenshot_as_file(imgpath)
imgpath:图片保存路径

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 截取屏幕截图,并保存到指定路径
imgpath = "screenshot.png"
driver.get_screenshot_as_file(imgpath)

driver.quit()

10.4 验证码

说明:一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性

10.5 为什么要学习验证码

在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而我们在设计自动化测试脚本的时候,就需要面临处理验证码的问题

10.6 验证码的处理方式

方式:
1). 去掉验证码
(测试环境下-采用)
2). 设置万能验证码
(生产环境和测试环境下-采用)
3). 验证码识别技术
(通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
4). 记录cookie
(通过记录cookie进行跳过登录)

10.7 cookie

在这里插入图片描述

  1. Cookie是由Web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。
  2. Cookie数据格式:键值对组成(python中的字典)
  3. Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie数据
  4. Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态

应用场景:

  1. 实现会话跟踪,记录用户登录状态
  2. 实现记住密码和自动登录的功能
  3. 用户未登录的状态下,记录购物车中的商品

Selenium操作cookie:

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

方法:

get_cookie(name) --> 获取指定cookie
name:为cookie的名称
get_cookies() --> 获取本网站所有本地cookies
 add_cookie(cookie_dict) --> 添加cookie
cookie_dict:一个字典对象,必选的键包括:"name" and "value"
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

# 获取指定cookie
cookie = driver.get_cookie("cookie_name")
print("指定cookie:", cookie)

# 获取所有本地cookies
cookies = driver.get_cookies()
print("所有本地cookies:", cookies)

# 添加cookie
cookie_dict = {"name": "my_cookie", "value": "123456"}
driver.add_cookie(cookie_dict)

driver.quit()
  • 在示例中,我们首先使用get_cookie()方法获取指定名为"cookie_name"的cookie,并将结果存储在cookie变量中

  • 接下来,我们使用get_cookies()方法获取当前网页的所有本地cookies,并将结果存储在cookies变量中

  • 然后,我们使用add_cookie()方法将一个名为"my_cookie"、值为"123456"的cookie添加到当前网页中

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值