学好selenium工具,就能实现你想得到的所有事情

这篇具有很好参考价值的文章主要介绍了学好selenium工具,就能实现你想得到的所有事情。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍背景

情况是这样的:某段时间之前,开发想找我用ui自动化帮他们实现一个功能:在系统某些时候生成报告的时候会failed,但是又不再重新生成,因此需要人工edit再次submit才能生成,原因png是由当前html页面生成。但是作为测试的我有一个疑惑?开始不是常用定时任务或是失败重试吗?怎么不这样做呢?或者有其他办法使之成功呢?然后开发自己优化了一下,就默默的成功了,这事儿就算过去了,不曾想几天前又复活了,需要我来协助,然后我问,这玩意儿不能使用接口去完成吗?开发解释:不能,why?原因是html转png:前端拿到接口响应数据,动态绘制html,然后再生成png。那么问题来了:为什么会失败?什么情况下会失败呢?

二、开发与实现

作者的python开发环境那是有好几套,接口、ui自动化的环境那是现成的,拿来即用,这里仅用来演示步骤。

2.1、部署开发环境

下载python安装包,一路默认,会自动加入path环境变量;
pip工具安装:pip install selenium
再下载对应chromedriver浏览器驱动:https://chromedriver.storage.googleapis.com/index.html

2.2、开始码代码<demo只为提供思路>

又因为作者是有比较系统的ui自动化测试思想,首先是po模式,但是这个需求是一次性的,所以并不想把它复杂化<相对线性脚本>,本着开发效率出发<不曾想也花了一天的时间,主要耗时在调试脚本>

#!/bin/python3
# -*-coding: utf-8 -*-
# 编码在linux环境下才能识别中文

import json
import logging
from time import sleep
import time

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


# 日志系统
log_format = '%(asctime)s - %(levelname)s - %(message)s'
logging.basicConfig(filename="scoreSys.log", filemode='a+', format=log_format, level=logging.DEBUG)

options = webdriver.ChromeOptions()
#options.add_argument('--disable-gpu')
#options.add_argument('--headless')
#options.add_argument('--no-sandbox')
#options.add_argument('--disable-dev-shm-usage')

# 初始化页面对象
driver = webdriver.Chrome(executable_path="../chromedriver.exe", options=options)


"""打开浏览器"""
# https://score.ieltsbro.com/
logging.info(">>>>>>>>>>>>>>>>>打开口语报告系统<<<<<<<<<<<<<<<<<<<<<<")
#     driver.get("https://xxx.xxx.com/home")
driver.get("https://uat.xxx.xxx.com/xxx/home")
driver.maximize_window()
driver.implicitly_wait(10)

# 登录页,页面元素
account_input = (By.XPATH, "//input[@placeholder='Email']")
passwd_input = (By.XPATH, "//input[@placeholder='Password']")
verify_code = (By.XPATH, "//input[@placeholder='Code']")
signIn_btn = (By.XPATH, "//span[text()=' Sign In ']")

# 登录的操作步骤
driver.find_element(*account_input).send_keys("xxx.x@hcp.tech")
driver.find_element(*passwd_input).send_keys("xxxxx")
driver.find_element(*verify_code).send_keys("1234")
driver.find_element(*signIn_btn).click()
logging.info(">>>>>>>>>>>>>>>>>用户登录口语报告系统<<<<<<<<<<<<<<<<<<<<<<")
sleep(1)


# ui登录后获取请求头中token属性
headers = {"content-type":"application/json"}
# 登录系统后用户名元素
account_text = (By.CSS_SELECTOR, ".user_name")
change_passwd = (By.CSS_SELECTOR, ".pwdBtn")

"""检查登录状态"""
account_info = driver.find_element(*account_text).text
logging.info(">>>>>>>>>>>>>>>>>检查用户是否成功登录系统<<<<<<<<<<<<<<<<<<<<<<")
try:
    assert account_info == "xxxx", "断言失败"
except:
    logging.info(">>>>>>>>>>>>>>>>>用户:{},登录失败!!!<<<<<<<<<<<<<<<<<<<<<<".format(account_info))
else:
    logging.info(">>>>>>>>>>>>>>>>>用户:{},登录成功!!!<<<<<<<<<<<<<<<<<<<<<<".format(account_info))
    userInfo = json.loads(driver.execute_script('return localStorage.getItem("userInfo");'))
    v = json.loads(userInfo.get("v"))
    token = v.get("token")
    headers["token"] = token

# 搜索条件
select_box = (By.XPATH, "//input[@placeholder='Report status']")
select_input = (By.XPATH, "//span[text()='Failed']")
select_btn = (By.XPATH, "//span[text()='Search']")

"""输入fail点击查询"""
# 查询操作
driver.find_element(*select_box).click()
sleep(1)
driver.find_element(*select_input).click()
driver.find_element(*select_btn).click()


# 列表是否有失败状态的
fail_status = "//td//div[text()='Fail']"
# 找到失败的edit按钮
edit_btn = (By.XPATH, "{}/../parent::td[1]//following-sibling::td//span[text()='Edit']".format(fail_status))
submit_selector = (By.XPATH, "//div[contains(text(),'Submit')]")

"""提交报告"""
# 首先按fail条件查询
click_search()
# 找到更多需要edit的按钮
status_eles = driver.find_elements(*edit_btn)
ele_nums = len(status_eles) # 页面元素找到元素不唯一
# 接口获取fail总数及id列表
nums, fail_li = get_fail_nums()

count = 0    # 记录真实补偿次数
success_li = []    # 记录成功补偿报告id
while ele_nums > 0:
    status_eles = driver.find_elements(*edit_btn)
    try:
        for ele in status_eles:
            clicked = ele.is_displayed() # 因为找到元素不唯一,需要判断元素是否显示
            if clicked:
                ele.click()
                driver.find_element(*submit_selector).click()    # 提交
                success_li.append(driver.current_url.split("=")[-1])
                #等待提交之后跳转的页面元素是否出现
                WebDriverWait(driver, 50).until(EC.presence_of_element_located(change_passwd)) 
                count += 1
    except:
        ele_nums -= 1
    else:
        ele_nums -= 1
    finally:
        click_search() # 每次需重新查询
            
driver.quit()
2.3、思路分析
  1. 第一步,开发针对我的特殊帐号去除验证码登录,<毕竟实现验证码登录成本还是有的>
  2. 首页增加报告查询条件:success or failed;
  3. 需要发送钉钉通知<这是后面实现>
  4. 操作流程:登录-检查登录状态-查询fail条件的数据-进入编辑页面-点击submit-再重新查询fail条件-如有继续edit-submit,如初反复直到没有fail的数据为止-关闭浏览器
2.4、难点解析

在selenium做ui自动化的时候,最难的不是实现某个功能代码块,而是定位元素的表达式,但是页面又不全是id、name等唯一元素,更多是需要写css_selector\xpath表达式;

  • html的结果页是个table,那么在根据fail失败元素同级找到它的edit,这个如下所示;是不是比较懵圈
# 列表是否有失败状态的
fail_status = "//td//div[text()='Fail']"
# 找到失败的edit按钮
edit_btn = (By.XPATH, "{}/../parent::td[1]//following-sibling::td//span[text()='Edit']".format(fail_status))
# 解释下上面的表达式:/.. 表示查找上级,parent::表示父级,following-sibling::平级中的下级
  • 其实实现之后并不需要如此,因为是先按fail条件查询,那么剩下就是fail,直接找edit即可。
  • 难点是ui+接口的结合;因为上述代码之初,在找到需要重新submit的报告,数目不正确,因为元素重复不唯一<每个元素都有显示和隐藏>,
clicked = ele.is_displayed() # 因为找到元素不唯一,需要判断元素是否显示
  • 所以想通过接口来确定真正fail的条数,所以先ui登录,获取token传递给接口请求,
    学好selenium工具,就能实现你想得到的所有事情
# 这是个新技能点,每次尝试不同的需求,总会遇到不同的问题,然后找到解决方案
userInfo = json.loads(driver.execute_script('return localStorage.getItem("userInfo");')) # 这个userInfo是key,而不是直接叫token
从demo中可以看出作者的po思想,将定位元素的标识单独提取出来保存,没直接放在方法里
  • 从demo中可以看出作者的po思想,将定位元素的标识单独提取出来保存,没直接放在方法里

这里提醒所有重试UI自动化测试的工作者:写代码不是为了去实现某个功能;而是提炼思想,解决思想问题,因为功能问题早晚都有解决办法,而解决问题的思想没有,那就真的没有了。

三、总结

条条大路通罗马,不是所有问题都只有一种解决办法,而是任何问题都会有解决办法。解决问题的思路很重要,思维、眼界需要打开,会有不一样的风景,感谢您的收看,咱们下次再见!日拱一卒无有尽,功不唐捐终入海。文章来源地址https://www.toymoban.com/news/detail-425786.html

到了这里,关于学好selenium工具,就能实现你想得到的所有事情的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • devexpress控件的2种汉化方法,官方想得很周到

    devexpress控件库默认安装后,使用的本地资源为英文。但其实它都有本地化资源包,比如按钮属性,控件属性描述,菜单项,确认和错误的信息等等,所有这些资源字符串可以很容易地被翻译成各种语言。对于要求使用中文汉字资源的项目来说,首要任务就是处理汉化。今天就

    2024年02月13日
    浏览(35)
  • 5个国内优秀的AI绘画工具,一句话就能生成精美图片,太厉害了_国内ai生成图片

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Python全套学习资料》,初

    2024年04月25日
    浏览(41)
  • 仅仅用java就能简单实现区块链(BlockChain)

    区块链逻辑:根据所需信息创建一个区块,再利用定义的计算hash值方法,不断进行计算,直到达到想要的结果,再通过层层验证,加入到我们的区块链中。 所谓挖矿,就是进行不断地计算,直到“挖到”,而这步算法我们是借助hash算法完成的。 老实说,“挖矿”这件事本身

    2024年02月02日
    浏览(45)
  • 记录--20行js就能实现逐字显示效果???-打字机效果

    横版 竖版 可以看到文字是一段一段的并且独占一行,使用段落标签p表示一行 一段文字内,字是一个一个显示的,所以这里每一个字都用一个span标签装起来 每一个字都是从透明到不透明的过渡效果,使用css3的过渡属性transition让每个字都从透明过渡到不透明 这里只需要一个

    2024年02月06日
    浏览(42)
  • 哄她开心的圣诞树html源码,复制粘贴就能实现~

    目录 前言 一、效果展示 二、代码展示 三、使用说明 总结         别送苹果了,玩点“高科技”逗女朋友开心吧。         效果如下: 圣诞树html代码示例         源代码如下:         首先把上面的源代码复制粘贴到一个txt文本中,再把代码中“高圆圆”换成

    2024年02月03日
    浏览(63)
  • 真的!不用代码就能实现复杂的场景可视化大屏交互功能!

    在很多可视化项目中,如果想要实现场景可视化大屏交互的功能,程序员们总是需要敲很多代码,才能最终产出有效的交互效果,在这之中,如果出现个bug,那在一大串代码中寻找这个bug 的出处,又必然是一件让人头疼的事情。难道就没有一种不用敲代码就能实现场景可视化

    2024年02月11日
    浏览(39)
  • 可以,很强,68行代码实现Bean的异步初始化,粘过去就能用。

    你好呀,我是歪歪。 前两天在看 SOFABoot 的时候,看到一个让我眼前一亮的东西,来给大家盘一下。 SOFABoot,你可能不眼熟,但是没关系,本文也不是给你讲这个东西的,你就认为它是 SpringBoot 的变种就行了。 因为有蚂蚁金服背书,所以主要是一些金融类的公司在使用这个框

    2024年02月07日
    浏览(59)
  • 如何学好数据结构

    本文 全为干货 ,没有晦涩难懂的专业名词,只有自己的 心得体会和有效的学习方法 ,希望可以帮到各位被数据结构犯难的同学 在我们学习数据结构的时候,我们通常一头雾水,甚至有时候不知道老师在讲什么,自然昏昏沉沉,上课的时候容易跑神,从而导致在做练习时两

    2024年02月14日
    浏览(36)
  • 学好Elasticsearch系列-分词器

    本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 先看后赞,养成习惯。 点赞收藏,人生辉煌。 目录 规范化:normalization 字符过滤器:character filter HTML Strip Character Filter Mapping Character Filter Pattern Replace Character Filter 令牌过滤器(token filter) 大小写和停用词

    2024年02月14日
    浏览(23)
  • 怎么学好前端

    前端薪资再高,自己没有本事也不是自己的! 现在前端刚刚入行学了点计算就找工作,是非常难的! 现在前端行业大不如以前,现在门栏涨了,邀求高了,薪资还是老样子,刚刚入行薪资一般都是4K 8K之间,有1年工作经验都是6K 10K左右,两年以上的,这个说不好,大部分薪

    2024年02月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包