这是python+selenium实现Web自动化第五篇博文

发布时间:2026/9/4 21:12:29
这是python+selenium实现Web自动化第五篇博文 一、前言在这段日子里, 询问我有关自动化的人数着实有点泛滥开来, 于个人而言, 突生一种奇特的想法, 那便是要从动辄归零的基础起始, 去讲解并且达成Web自动化测试事宜, 烦请关注博客, 此博客会持续不断地予以更新这是实现Web自动化第五篇博文二、前四篇博文地址【篇】, 实现Web , 搭建环境、原理、定位元素以及浏览器常规操作【篇】实现Web自动化鼠标操作和键盘操作使用【篇】, 达成对于Web的自动化, 有着元素三类等待这一情况, 属于多窗口之间的切换, 还涉及警告框的处理, 并存在下拉框的选择操作。【篇】实现Web自动化文件上传操作调用窗口截图三、之-读取元素配置文件在经历前面的学习之后, 我们已然能够去写一些简单的用于自动化测试的用例了, 然而你们是否察觉到我们写出了数量众多的重复代码呢 比如 在页面之中关键元素的查找以及传值。对于自动化测试页面而言, 页面元素是比较稳定的, 可以将重复性代码封装起来, 直接读取稳定的页面元素, 这些元素信息写在配置文件中, 如果页面元素变动, 只需修改相应页面元素信息无需每次修改代码, 以此尽可能避免引入bug。1.创建配置文件读取配置文件前按页面元素的特点写进配置文件中。register_email\nregister_nickname idregister_nickname\nregister_password idregister_password\ngetcode_num idgetcode_num\ncaptcha_code idcaptcha_code\n,classes:[]} data-cke-widget-upcasted1 data-cke-widget-keep-attr0 data-widgetcodeSnippet[RegisterElement] register_email idregister_email register_nickname idregister_nickname register_password idregister_password getcode_num idgetcode_num captcha_code idcaptcha_code2.读取配置文件#!/usr/bin/env python # -*- encoding: utf-8 -*- Time : 2020/4/17 Author : 公众号软测之家 更多技术干货软测视频面试资料请关注 Contact : 软件测试技术群695458161 License : (C)Copyright 2017-2019, Micro-Circle Desc : None import configparser class ReadIni(object): # 初始化配置文件路径及节点加载 def __init__(self, file_nameNone, nodeNone): if file_name is None: self.file_name ../data/RegisterElement.ini if node is None: self.node RegisterElement else: self.node node self.cf self.load_ini() # 加载配置文件 def load_ini(self): cf configparser.ConfigParser() cf.read(self.file_name) return cf # 获取各个配置项的值 def get_value(self, key): data self.cf.get(self.node, key) return data if __name__ __main__: ri ReadIni() print(ri.get_value(register_nickname))四、之-元素封装查找页面元素代码封装。)[0]\n value data.split()[1]\n try:\n if by id:\n return self.driver.find_element_by_id(value)\n elif by name:\n return self.driver.find_element_by_name(value)\n elif by className:\n return self.driver.find_element_by_className(value)\n else:\n return self.driver.find_element_by_xpath(value)\n except:\n file_path ../image/no_element.png\n self.driver.save_screenshot(file_path)\n\n\nif __name__ \__main__\:\n fe FindElement()\n fe.get_element(register_nickname),classes:[]} data-cke-widget-upcasted1 data-cke-widget-keep-attr0 data-widgetcodeSnippet#!/usr/bin/env python # -*- encoding: utf-8 -*- Time : 2020/4/17 Author : 公众号软测之家 更多技术干货软测视频面试资料请关注 Contact : 软件测试技术群695458161 License : (C)Copyright 2017-2019, Micro-Circle Desc : None from util.read_ini import ReadIni class FindElement(object): def __init__(self, driver): self.driver driver def get_element(self, key): ri ReadIni() data ri.get_value(keykey) by data.split()[0] value data.split()[1] try: if by id: return self.driver.find_element_by_id(value) elif by name: return self.driver.find_element_by_name(value) elif by className: return self.driver.find_element_by_className(value) else: return self.driver.find_element_by_xpath(value) except: file_path ../image/no_element.png self.driver.save_screenshot(file_path) if __name__ __main__: fe FindElement() fe.get_element(register_nickname)五、之-代码封装当写到此处的时候, 是不是会感觉到, 尽管代码已然被写出来了, 然而却十分缺乏条理性呢? 没错, 正是这样, 当下就要把代码进行模块化处理, 使得它的每个模块都去做一部分事情。#!/usr/bin/env python # -*- encoding: utf-8 -*- Time : 2020/4/17 Author : 公众号软测之家 更多技术干货软测视频面试资料请关注 Contact : 软件测试技术群695458161 License : (C)Copyright 2017-2019, Micro-Circle Desc : None from selenium import webdriver from time import sleep from util.read_ini import ReadIni from basic.find_element import FindElement import random from PIL import Image from api import ShowapiRequest class Register(object): def __init__(self, url): self.driver self.get_driver(urlurl) # 启动浏览器打开目标测试页面url def get_driver(self, url): driver webdriver.Chrome(../tools/chromedriver.exe) driver.get(urlurl) driver.maximize_window() return driver # 定位用户信息获取元素element def get_user_element(self, key): find_element FindElement(self.driver) user_element find_element.get_element(keykey) return user_element # 输入用户信息 def send_user_info(self, key, data): self.get_user_element(keykey).send_keys(data) # 获取随机数 def get_range(self): number .join(random.sample(abcdefg123456, 8)) return number # 获取验证码图片 def get_captcha_image(self, file_name): self.driver.save_screenshot(filenamefile_name) captcha_element self.get_user_element(getcode_num) left captcha_element.location[x] top captcha_element.location[y] right captcha_element.size[width] left height captcha_element.size[height] top image Image.open(file_name) img image.crop((left, top, right, height)) img.save(file_name) # 识别图片验证码 def discern_captcha_image(self, file_name): self.get_captcha_image(file_namefile_name) # 解析验证码图片中的文字用第三方的图片验证码识别接口 ShowApiRequest r ShowapiRequest(http://route.showapi.com/184-4, 48120, 12c017278c0845c2bcda177212d2d2ac) r.addBodyPara(img_base64, ) r.addBodyPara(typeId, 35) r.addBodyPara(convert_to_jpg, 0) r.addBodyPara(needMorePrecise, 0) r.addFilePara(image, file_name) # 文件上传时设置 res r.post() text res.json()[showapi_res_body][Result] return text # 主函数 def main(self): register_nickname self.get_range() register_email self.get_range() 163.com register_password self.get_range() 123 file_name ../image/code_image.png captcha_code self.discern_captcha_image(file_namefile_name) self.send_user_info(register_nickname, register_nickname) self.send_user_info(register_email, register_email) self.send_user_info(register_password, register_password) self.send_user_info(captcha_code, captcha_code) self.get_user_element(register-btn).click() sleep(5) self.driver.close() if __name__ __main__: register_url http://www.5itest.cn/register r Register(register_url) r.main()六、之-异常处理我们在测试期间, 要使得程序能够毫无阻碍地顺畅运行, 与此同时, 还得留意对程序所出现的异常开展处理工作, 举例来说, 鉴于调用的第三方接口呈现的是验证码图片, 这种情况下难以避免会出现无法识别的状况, 为了不让程序在正常运行时出现阻塞现象, 当识别行动出现错误之际, 可以针对错误识别实施异常方面的处理措施。captcha_code-error\n,classes:[]} data-cke-widget-upcasted1 data-cke-widget-keep-attr0 data-widgetcodeSnippet# 在 [RegisterElement.ini] 文件添加验证码错误的元素id captcha_code_error idcaptcha_code-error# 在 package.py 代码的基础上加上异常处理 # 异常处理注册失败进行截图方便问题排查 captcha_code_error self.get_user_element(captcha_code_error) if captcha_code_error is None: print(......恭喜你注册成功了......) else: self.driver.save_screenshot(../image/captcha_code_error.png) sleep(5)七、之-兼容多浏览器执行于实际的测试里头, 鉴于不同浏览器的技术标准存有差异, 故而致使同一份代码在不同浏览器里的表现形式并不一致, 因而无法避免要在多浏览器执行测试用例。注意 驱动与 的驱动配置不同下载地址下载后根据系统版本选择1解压取出.exe以64x为例2将.exe放到的安装目录下如D:\火狐\ 3把火狐的安装之处, 也就是D:\火狐\ , 增添至环境变量path里。4重启 IDEA记得一定要# 兼容多浏览器执行测试 def get_more_driver(self, url, browser): if browser chrome: # 版本 76.0.3809.10064位对应的驱动 driver webdriver.Chrome(../tools/chromedriver.exe) elif browser firefox: # FireFox 68.0.2(64位) 对应的驱动和 chrome 驱动使用有差异 driver webdriver.Firefox() driver.get(urlurl) driver.maximize_window() return driver八、持续更新中请关注倘若你认为这篇文章对你存有帮助, 倘若你对软件测试感兴趣, 倘若你对接口测试感兴趣, 倘若你对自动化测试感兴趣, 倘若你对面试经验交流感兴趣, 欢迎加入:专门用于软件测试技术交流的群, 群内所发放的那些免费资料, 皆是笔者历经十多年在测试领域的职业生涯所积累的精华内容。并且还能与同行中的大神一道交流探讨技术呢。