本文以一个页面例子说明运行自动化脚本需要哪些步骤及实现过程中的报错汇总。具体实现功能:
登录操作
进入三级菜单
新建页面输入文本框值,输入时间,进入iframe,点击提交按钮
一、自动化实现步骤
1. 首先需要导入模块名
有些功能selenium框架已经封装好了,只需要我们直接调用就好。
常用的导入功能:
from selenium import webdriver #导入webdriver驱动
from time import sleep #导入sleep函数
from selenium.webdriver.common.action_chains importActionChains #导入
ActionChains 函数
from selenium.webdriver.support.select import Select#导入select函数
webdriver驱动:通过webdriver驱动来调用浏览器
sleep函数:正常网页加载过程中,如果不通过时间等待再点击元素是无法定位到元素,从而报错,sleep函数是自动化过程中经常用到的功能
ActionChains函数:ActionChains是模拟鼠标事件的函数
2. 启动浏览器
所有的自动化操作都是基于页面打开的前提下,所以我们的首要步骤显示要启动浏览器。
在Selenium中可以启动任何浏览器,前提是需要下载相应的浏览器驱动这里以chrome浏览器为例,代码实现:
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
driver = webdriver.Chrome(options=chrome_options)
driver.get("http://127.0.0.1:8080/portal-web/framework/login?")
driver.maximize_window()
3. 功能实现
3.1 元素定位
刚接触自动化的同学可能都被元素定位搞的晕头转向。
元素定位有八大方式(id、tagname、class、xpath等等),到底使用哪一种呢
所有的元素定位方式我都用到了,还是不能定位到元素这到底是什么原因呢?
刚开始我也是这样,经过一段时间的摸索发现原来是这样~~
元素定位-id,id是唯一,通过id可定位任何元素
元素定位-xpath定位:其他定位方式都不会,只要会xpath就能搞定定位问题
定位不到:考虑时间、窗体、ifame等因素
3.2 元素方法
1).click()-单击(最常用)
driver.find_element_by_id('dlu').click()
2)send_keys文本框输入内容
driver.find_element_by_id('password').send_keys('11qq!!')
实现功能:登录功能
driver.find_element_by_name("username").send_keys('b')#定位用户名,输入值
driver.find_element_by_id('password').send_keys('11qq!!')#定位密码,输入值
driver.find_element_by_id('dlu').click()#点击登录按钮
3)double_click 双击
ActionChains(driver).double_click(ul1).perform()
实现功能:双击进入三级菜单
ul1=driver.find_element_by_xpath("//*[text()='质量基础']")
ActionChains(driver).double_click(ul1).perform()#双击一级菜单
ul2=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证']")
ActionChains(driver).double_click(ul2).perform()#双击二级菜单
ul3=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证计划']")
ActionChains(driver).double_click(ul3).perform()#双击三级菜单
sleep(3)
4) iframe标签,这块属于自动化的重点及难点
driver.switch_to.frame('data_iframe')#进入标签
driver.switch_to.parent_frame() #跳回到上层标签
driver.switch_to.default_content()#退出标签
实现功能:三个 iframe 间切换操作
driver.switch_to.frame('data_iframe')#主页面窗体
driver.find_element_by_xpath('//*[@id="grid"]/div[1]/a[1]').click()
sleep(3)
# 第二个iframe填写内容新建
#下拉菜单非select类型,直接定位选择内容
iframe1 = driver.find_element_by_xpath('//*[@title="新建页面"]')
driver.switch_to.frame(iframe1) #新建页面标签
iframe2=driver.find_element_by_xpath("//iframe[contains(@src,'/quality-web/certifischeController/input')]")
driver.switch_to.frame(iframe2)#新建页嵌套标签
driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[2]/td[8]/span/span/span[1]').click()
sleep(2)
driver.find_element_by_xpath("//*[text()='2020财年当年4月']").click()
sleep(2)
driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[2]/span/span').click()
sleep(1)
driver.find_element_by_xpath("//*[text()='111']").click()
sleep(1)
#完成时间控件选择
js = "$('.kendoDate').removeAttr('readonly')" # jQuery,移除属性
# js = "$('input:eq(0)').attr('readonly',false)" # jQuery,设置为false
driver.execute_script(js)
sleep(2)
driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span/input').send_keys("2020-06-22")
#认证日期
driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[7]/span/span/input').send_keys('2020-06-22')
driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[8]/span/span/input').send_keys('2020-06-22')
#文本框输入
driver.find_element_by_xpath('//*[@data-isq="工作项目"]').send_keys("您好")
sleep(1)
driver.find_element_by_xpath('//*[@data-isq="详细计划"]').send_keys("您好")
sleep(1)
#
driver.find_element_by_xpath('//*[@data-isq="供应商名称"]').send_keys("您好")
sleep(1)
driver.find_element_by_xpath('//*[@data-isq="制造地址/邮编"]').send_keys("您好")
sleep(1)
driver.find_element_by_xpath('//*[@data-isq="电话/传真"]').send_keys("您好")
sleep(1)
driver.find_element_by_xpath('//*[@data-isq="认证产品"]').send_keys("您好")
sleep(1)
#树形结构
#批准人
driver.find_element_by_xpath('//*[@data-isq="计划审核人"]').click()
people=driver.find_element_by_xpath('//*[@title="人员选择"]')
driver.switch_to.frame(people) #进入选人 ifame
sleep(2)
driver.find_element_by_id('searchbox').send_keys('b')
sleep(2)
driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()
sleep(2)
driver.find_element_by_xpath('//*[@id="okButton"]').click()
sleep(2)
#计划批准人
driver.switch_to.parent_frame()) #人员选择成功后,返回上级弹窗
driver.find_element_by_xpath('//*[@data-isq="计划批准人"]').click()
people=driver.find_element_by_xpath('//*[@title="人员选择"]')
driver.switch_to.frame(people)#进入批准人弹窗
sleep(2)
driver.find_element_by_id('searchbox').send_keys('b')
sleep(2)
driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()
sleep(2)
driver.find_element_by_xpath('//*[@id="okButton"]').click()
sleep(2)
#跳回 frame1
driver.switch_to.parent_frame() 返回上层
driver.switch_to.parent_frame()返回上层
driver.find_element_by_id("buttons2").click()
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div[2]/span[4]/a').click()
driver.switch_to.default_content()#退出标签
5) 时间控件
时间控件正常操作是点击并选择时间
自动化 input 标签由于 readonly 属性,所以日期控件是不允许输入的,那么我们主要通过 js 来删除或者 readonly 制成否,这样可以直接允许输入。
js = "$('.kendoDate').removeAttr('readonly')" # jQuery,移除属性
driver.execute_script(js) #执行 js 脚本
实现功能
js = "$('.kendoDate').removeAttr('readonly')" # jQuery,移除属性
driver.execute_script(js)
sleep(2)
driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span/input').send_keys("2020-06-22")#输入固定日期
#认证日期
driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[7]/span/span/input').send_keys('2020-06-22')
driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[8]/span/span/input').send_keys('2020-06-22')
6) 键盘操作
driver.find_element_by_class().send_keys(Keys.CONTROL+'a')
4. 执行完操作后关闭浏览器
driver.quit()
二、报错处理方案
1.pycharm引入包报错, 选中模块名称 【右键】-> 【mark directory as 】-> 【sources root】
2.pycharm中如何调节字体大小位置
菜单栏:file ----> setting —> editor —>font —> size 修改为需要大小字号例如20,点击ok
1. 消息弹窗 3
打开F12,在source里面点击暂停脚本执行,把元素定住,然后再去写xpath定位
4. 测试报告点击浏览器打开提示“系统找不到文件 chrome”
出现该报错主要是因为你没有进行chrome浏览器安装路径的配置,解决方法很简单:打开pycharm–》File–》setting–》Tools–》Web Browsers
在Default Browser一栏勾选Custom Path(敲黑板)
然后将chrome的路径改为安装路径即可,如图所示:
5.运行脚本,提示chrome正在受到自控软件控制-属于chrome浏览器特有的问题
首先查看浏览器版本75版本以下:
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=option)
url=''
driver.get(url)
————————————————