自动化测试工具Selenium

2028 篇文章 51 订阅
1248 篇文章 21 订阅
本文详细介绍了Selenium自动化测试工具的环境搭建、常用API、页面元素操作、链式调用、获取网页cookie、页面标签切换、等待页面加载等核心功能。通过一个教务网实战案例,演示了包括iframe切换、验证码识别在内的完整登录流程,帮助读者掌握Selenium在实际场景中的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述
本篇文章将介绍selenium自动化测试工具。看完这篇文章,完全有能力写出一个抢课脚本。文章最后有一个教务网的实战案例,包括验证码识别,自动化处理流程分析。

1.环境搭建

1.1下载驱动程序

以谷歌浏览器为例

下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads

1.2安装selenium

pip install selenium

1.3 基本测试

编写代码,如果程序能正常启动,那么环境搭建就没有问题。

from selenium import webdriver

dirver_path = r"C:\Users\gmbjzg\Desktop\chromedriver_win32\chromedriver.exe"

driver = webdriver.Chrome(executable_path=dirver_path)

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

2.常用API详解

2.1元素定位

我们可以通过以下几种方式定位元素

id选择器

driver.find_element_by_id('kw')

类选择器

driver.find_element_by_class_name('submit')

标签选择器

driver.find_element_by_tag_name('input')

xpath定位

driver.find_element_by_xpath('//div')

css选择器

driver.find_element_by_css_selector('#box>.top')

还可以根据input标签的name属性定位表单元素

driver.find_element_by_name('pwd')

2.2表单元素操作

input 输入框

模拟输入

inputTag = driver.find_element_by_id('pwd')
inputTag.send_keys('python')

清空输入框

inputTag.clear()

button 按钮

模拟点击

inputTag = driver.find_element_by_id('kw')
inputTag.click()

checkbox 记住我

模拟点击

rememberTag = driver.find_element_by_id("remember")
rememberTag.click()

select 下拉菜单

模拟选中选项

from selenium.webdriver.support.ui import Select

selectTag = Select(driver.find_element_by_name("Menu"))

selectTag.select_by_index(1)
selectTag.select_by_index(2)

3.链式调用

from selenium.webdriver import ActionChains

dirver_path = r"C:\Users\gmbjzg\Desktop\chromedriver_win32\chromedriver.exe"

driver = webdriver.Chrome(executable_path=dirver_path)

# 定位标签
inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')

# 链式调用
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()

4.获取网页cookie

获取网页所有cookie信息

driver.get_cookies()

获取某个cookie值

driver.get_cookie(key)

5.页面标签切换

# 打开一个新的标签页(JS注入)
driver.execute_script("window.open(%s)" % url)
# 切换到新页面
driver.switch_to_window(driver.window_handles[1])

6.等待页面加载

隐式等待(强制等待几秒钟)

driver = webdriver.Chrome(executable_path=driver_path)

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

driver.implicitly_wait(10)

显示等待(如果元素加载完成,则不再等待,指定等待多长时间后不再等待)

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

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

element = WebDriverWait(driver, 10).until(
  expected_conditions.presence_of_element_located((By.ID, "pwd"))
)

7.关闭页面和浏览器

示例代码如下

driver.close() # 关闭当前页面
driver.quit() # 退出浏览器

8.案例实战

最后以自动登录某教务系统为例作结束本篇文章

网址:http://jw.zhku.edu.cn/home.aspx

第一步,打开网页定位元素

我们遇到的第一个问题就是这个网站是使用iframe标签嵌套的,如果直接定位元素是无法获取的。需要先切换到iframe标签,再进行操作。

示例代码如下

# 切换到iframe标签
driver.switch_to.frame("frm_login")

第二步,获取标签元素

# 元素获取
xhInputTag = driver.find_element_by_id("txt_asmcdefsddsd")
pwdInputTag = driver.find_element_by_id("txt_psasas")
yzmInputTag = driver.find_element_by_id("txt_sdertfgsadscxcadsads")
imgCodeTag = driver.find_element_by_id("imgCode")
submitTag = driver.find_element_by_name("btn_login")

第三步,表单填值

# 表单填值
actions = ActionChains(driver)
actions.move_to_element(xhInputTag)
actions.send_keys_to_element(xhInputTag, "学号")
actions.move_to_element(pwdInputTag)
actions.send_keys_to_element(pwdInputTag, "密码")
actions.move_to_element(yzmInputTag)

这里遇到了第二个问题就是需要识别图片验证码。并且首页加载的时候,图片验证码是不显示的,需要先点击一下验证码输入框。

示例代码如下

yzmInputTag.click()

获取验证码

imgCodeTag.screenshot('yzm.jpg')

识别验证码,直接调用第三方接口。这个验证码识别接口是在百度上随手一搜的,大家可自行找一个打码平台。

图鉴验证码识别:http://www.ttshitu.com/

# 识别验证码
def base64_api(uname, pwd, img, typeid):
    with open(img, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        b64 = base64_data.decode()
    data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        return result["message"]
    return ""

# 3 代表中英文
yzmCode = base64_api('账号', '密码', 'yzm.jpg', 3)

验证码输入

输入验证码
actions.send_keys_to_element(yzmInputTag, yzmCode)
actions.move_to_element(submitTag)
actions.click(submitTag)

第四步, 登录执行

执行
actions.perform()

第五步,去除弹窗确认

当我们成功登录之后,会有一个别处已下线的弹窗确认,我们需要去除这个弹窗确认 示例代码如下

# 5.执行
driver.switch_to.alert.dismiss()

完整代码如下:

from selenium import webdriver
from selenium.webdriver import ActionChains
import base64
import json
import requests

dirver_path = r"C:\Users\gmbjzg\Desktop\chromedriver_win32\chromedriver.exe"

driver = webdriver.Chrome(executable_path=dirver_path)

driver.get("http://jw.zhku.edu.cn/home.aspx")

# 切换到iframe标签
driver.switch_to.frame("frm_login")

# 1.元素获取
xhInputTag = driver.find_element_by_id("txt_asmcdefsddsd")
pwdInputTag = driver.find_element_by_id("txt_psasas")
yzmInputTag = driver.find_element_by_id("txt_sdertfgsadscxcadsads")
imgCodeTag = driver.find_element_by_id("imgCode")
submitTag = driver.find_element_by_name("btn_login")


# 5.表单填值
actions = ActionChains(driver)
actions.move_to_element(xhInputTag)
actions.send_keys_to_element(xhInputTag, "")
actions.move_to_element(pwdInputTag)
actions.send_keys_to_element(pwdInputTag, "")
actions.move_to_element(yzmInputTag)
yzmInputTag.click()

# 2.获取验证码
imgCodeTag.screenshot('yzm.jpg')


# 3.识别验证码
def base64_api(uname, pwd, img, typeid):
    with open(img, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        b64 = base64_data.decode()
    data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        return result["message"]
    return ""


yzmCode = base64_api('', '', 'yzm.jpg', 3)

# 4.输入验证码
actions.send_keys_to_element(yzmInputTag, yzmCode)
actions.move_to_element(submitTag)
actions.click(submitTag)

# 5.执行
actions.perform()

# 6.去除弹窗确认
driver.switch_to.alert.dismiss()

通过这个案例,相信大家对selenium工具的使用已经有初步的认识啦!更多好玩的东西就留给大家自己发掘了。

最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值