位置: IT常识 - 正文

Web自动化之Selenium常用操作(web自动化selenium实战项目)

编辑:rootadmin
Web自动化之Selenium常用操作

推荐整理分享Web自动化之Selenium常用操作(web自动化selenium实战项目),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:web自动化项目实战,web自动化怎么做的,web自动化是什么意思,web自动化工具有哪些,web自动化ride,web自动化怎么做的,web自动化selenium实战项目,web自动化怎么做的,内容如对您有帮助,希望把文章链接给更多的朋友!

本文总结使用selenium进行web/UI自动化时,会用到的一些常用操作。

定位元素driver.find_element_by_xpath()#1、绝对路径 2、元素属性 3、层级和属性结合 4、使用逻辑运算符driver.find_element_by_id()#根据id定位,HTML规定id属性在HTML文档中必须是唯一的driver.find_element_by_name()#name属性定位driver.find_element_by_class_name()#class属性定位driver.find_element_by_tag_name()#标签名字定位 因为标签基本都不是唯一的,所以不用这个driver.find_element_by_link_text()#定位文本链接,需要对应的元素有href属性driver.find_element_by_partial_link_text()#模糊定位文本链接driver.find_element_by_css_selector()#CSS选择器By定位元素

是元素定位另外一种方式,跟上面的8种底层一样。

from selenium.webdriver.common import Bydriver.find_element(By.ID,'kw')定位一组元素driver.find_elements_by_xpath()#其他方法同理driver.find_elements(By.XPATH,'') 浏览器操作driver.set_window_size()#设置浏览器大小,可以设置成移动端大小driver.back()#浏览器后退driver.forward()#浏览器前进driver.set_window_position()driver.set_window_rect()driver.refresh()#模拟浏览器刷新driver.maximize_window()#最大化浏览器设置浏览器参数

在定义driver的时候设置chrome_options参数,该参数是一个Options类所实例化的对象。其中,常用的参数是设置浏览器是否可视化和浏览器的请求头等信息,前者可以加快代码的运行速度,后者可以有效地防止网站的反爬虫检测

from selenium.webdriver.chrome.options import Optionsurl='https://movie.douban.com/'#Options类实例化chrome_options=Options()#设置浏览器参数#--headless是不 显示浏览器启动和执行过程cchrome_options.add_argument('--headless')#设置lang和User-Agent信息,防止反爬虫检测chrome_options.add_argument('lang=zh_CN.UTF-8')UserAgent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.101 Safari/537.36'chrome_options.add_argument('User-Agent='+UserAgent)#启动浏览器并设置chrome_options参数driver=webdriver.Chrome(options=chrome_options)driver.get(url)driver.maximize_window()print(driver.title)# print(driver.page_source) #获取网页的html代码元素操作driver.find_element_by_xpath().click()#点击元素driver.find_element_by_xpath().clear()#清空文本driver.find_element_by_xpath().send_keys()#模拟键盘输入 页面交互

webElement接口提供了一些可以与页面交互的方法

submit和click在某些情况下可以互换,submit只用于表单的提交按钮。

driver.find_element_by_xpath().submit()#提交输入框的内容 类似于回车提交搜索框内容driver.find_element_by_xpath().size#返回元素尺寸driver.find_element_by_xpath().text#获取元素文本driver.find_element_by_xpath().get_attribute()#获取元素属性值driver.find_element_by_xpath().is_selected()#是否被选中driver.find_element_by_xpath().is_enabled()#判断元素是否可以使用driver.find_element_by_xpath().is_displayed()#返回元素是否用户可见鼠标事件

关于鼠标操作的方法都封装在Actionchains中

from selenium.webdriver.common.action_chains import ActionChainsrigt_check=driver.find_element_by_id('kw')ActionChains(driver).context_click(rigt_check).perform()#context_click对元素右击操作#perform()执行所有ActionChains中存储的行为ActionChains(driver).move_to_element(rigt_check).perform()#鼠标悬停ActionChains(driver).double_click(rigt_check).perform()#鼠标双击ActionChains(driver).drag_and_drop(source,target).perform()#鼠标由源元素拖动至目标元素url='https://passport.bilibili.com/login'driver=webdriver.Chrome()driver.get(url)#双击登录按钮ele=driver.find_element_by_class_name('tit')ActionChains(driver).double_click(ele).perform()sleep(2)#拖拽滑块ele=driver.find_element_by_class_name('gt_slider_knob,gt_show')ActionChains(driver).drag_and_drop_by_offset(ele,100,0).perform()

键盘事件

模拟键盘输入,可以是按键,组合键。

from selenium.webdriver.common.keys import Keysdriver.find_element_by_xpath().send_keys(Keys.BACK_SPACE)#对该元素操作一次backspacedriver.find_element_by_xpath().send_keys(Keys.SPACE)#对该元素输入空格driver.find_element_by_xpath().send_keys(Keys.CONTROL,'a')#ctrl+A全选输入框内容driver.find_element_by_xpath().send_keys(Keys.CONTROL,'x')#ctrl+x剪切输入框内容driver.find_element_by_xpath().send_keys(Keys.CONTROL,'v')#ctrl+v粘贴内容到输入框driver.find_element_by_xpath().send_keys(Keys.ENTER)#通过回车键代替单击操作driver.find_element_by_xpath().send_keys(Keys.F1)#键盘F1from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.by import Byfrom time import sleepurl='https://www.baidu.com'driver=webdriver.Chrome()driver.get(url)ele=driver.find_element_by_id('kw')ele.send_keys("selenium")sleep(2)#删除最后一个文字ele.send_keys(Keys.BACK_SPACE)sleep(2)#添加空格键+教程ele.send_keys(Keys.SPACE)ele.send_keys("教程")sleep(2)#ctrl+a全选输入框内容ele.send_keys(Keys.CONTROL,'a')sleep(2)#ctrl+x 剪切输入框内容ele.send_keys(Keys.CONTROL,'x')sleep(2)#ctrl+v 粘贴内容到输入框ele.send_keys(Keys.CONTROL,'v')sleep(2)#回车键代替单击driver.find_element_by_id('su').send_keys(Keys.ENTER)获得验证信息

自动化用例执行完成后,可以从页面上获取一些信息来证明用例执行成功或者失败

driver.title #获得页面titledriver.current_url#获得页面curldriver.find_element_by_xpath().text#获取元素文本 元素等待

由于web页面多数使用AJAX技术,浏览器在加载页面时,页面上的元素可能不是同时被加载完成的,需要加入等待。

显式等待:显性等待能够根据判断条件而灵活地等待,程序每隔一段时间检测一次,如果检测结果与条件相符,就执行下一步,否则继续等待,直到超过设置的最长时间为止

from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECelement=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(By.ID,'kw'))#每0.5秒检测一次这个元素能否被定位到,5秒后超时#expected_conditions提供了很多预期条件判断方法#也可以用is_displayed()判断元素是否可见

隐式等待

隐性等待是指在一个设定的时间内检测网页是否加载完成,也就是一般情况下用户看到浏览器标签栏那个小圈不再转,才会执行下一步。比如代码中设置30秒等待时间,网页只要在30秒内完成加载就会自动执行下一步,如果超出30秒就会抛出异常。值得注意的是,隐性等待对整个driver的周期都起作用,所以只要设置一次即可。

通过一定的时长等待页面上某元素加载完成,如果超出了设置的时长元素,还没有被加载,则抛出没有元素异常。

通常设置在driver后面。

driver.implicitly_wait(10)

sleep休眠方法

在需要的地方添加。

from time import sleepsleep(3)

隐性等待和显性等待相比于time.sleep这种强制等待更为灵活和智能,可解决各种网络延误的问题,隐性等待和显性等待可以同时使用,但最长的等待时间取决于两者之间的最大数,如上述代码的隐性等待时间为30秒,显性等待时间为20秒,则该代码的最长等待时间为隐性等待时间。 

多框架切换

frame是一个框架页面,在HTML 5中已经不支持使用框架,但在一些网站中依然会看到它的身影。frame的作用是在HTML代码中嵌套一个或多个不同的HTML代码,每嵌套一个HTML代码都需要由frame来实现

iframe和frame实现的功能是相同的,只不过使用方式和灵活性有所不同,无论是iframe还是frame,Selenium的定位和操作方式都是一样的

由于一个HTML可以嵌套一个或多个iframe,因此Selenium在操作不同的iframe时需要通过switch_to.frame()来切换到指定的iframe,再执行相应的操作 

driver.switch_to.frame('kw')#可以直接取表单的id或者name属性,如果表单没有这两个属性,可以先定位表单元素,再切换driver.switch_to.parent_frame('kw')#跳出当前一级表单driver.switch_to.default_content('kw')#跳回最外层页面#根据索引定位driver.switch_to_frame(0)#根据id或者name属性driver.switch_to_frame('framea')新版本 driver.switch_to.frame(0)Web自动化之Selenium常用操作(web自动化selenium实战项目)

如百度知道的文本框 

如下代码实现打开百度知道题目页面,点击我要回答,定位至iframe,输入内容,跳出iframe,并点击提交回答按钮

url='https://zhidao.baidu.com/question/1903337615241287780.html'driver=webdriver.Chrome()driver.get(url)driver.maximize_window()#点击我要回答driver.find_element_by_id('answer-bar').click()#切换到frame内部的htmldriver.switch_to.frame('ueditor_0')#定位frame内部的元素driver.find_element_by_xpath('/html/body').send_keys('美国')#跳回网页HTML 如果不切回网页,则找不到提交回答按钮,且js代码也执行不了# driver.switch_to.default_content()js='window.scrollTo(0,100)'driver.execute_script(js)sleep(3)#点击网页提交回答按钮driver.find_element_by_xpath("//div[@class='addons line']/a").click() 多窗口切换search_windows=driver.current_window_handle #获得当前窗口句柄all_handles=driver.window_handles #获得所有窗口的句柄driver.switch_to.window(handle)#切换窗口handles=driver.window_handlesdriver.switch_to_window(handles[0])driver.switch_to_window(handles[1])

应用

from selenium import webdriverfrom selenium.webdriver.common.by import Byurl='https://www.baidu.com/'driver=webdriver.Chrome()driver.get(url)driver.implicitly_wait(10)search_windows=driver.current_window_handle #获得窗口句柄driver.find_element_by_link_text('登录').click()driver.find_element_by_link_text('立即注册').click()import time#获得所有窗口的句柄all_handles=driver.window_handles#切换到注册窗口for handle in all_handles: if handle!=search_windows: driver.switch_to.window(handle) print("当前是注册窗口") time.sleep(2)#回到搜索窗口for handle in all_handles: if handle==search_windows: driver.switch_to.window(handle) print("当前是搜索窗口") driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click()#关闭注册窗口 driver.find_element_by_id('kw').send_keys("selenium") driver.find_element_by_id('su').click() time.sleep(2)driver.quit()警告框处理

webdriver中处理JavaScript生成的alert,confirm,prompt十分简单,具体做法是使用switch_to_alert方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/send_keys等方法进行操作。

text:返回alert/confirm/prompt中的文字信息

accept():接受现有警告框

dismiss():解散现有警告框

send_keys:发送文本至警告框

应用,如图切换至alert并接受

from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.by import Byfrom time import sleepurl='https://www.baidu.com/'driver=webdriver.Chrome()driver.get(url)driver.maximize_window()driver.implicitly_wait(10)#鼠标悬停至设置链接link=driver.find_element_by_id("s-usersetting-top")ActionChains(driver).move_to_element(link).perform()driver.find_element_by_link_text('搜索设置').click()#保存设置driver.find_element_by_class_name('prefpanelgo').click()sleep(2)#接受警告框# driver.switch_to_alert().accept()driver.quit() 上传文件

一般文件上传,是打开windows窗口从窗口中选择本地文件,但webdriver无法操作windows控件。

1、普通上传 将本地文件路径作为值传给input标签,注意必须是input标签

2、插件上传,基于flash,js,Ajax等技术实现上传

#定位上传按钮,添加本地文件driver.find_element_by_name('file').send_keys("D:\\upload_file.txt")

另一种方法为基于AutoIt软件来实现上传。但是不推荐,因为不在Python范围。

下载文件

webdriver允许设置默认的文件下载路径,文件会被自动下载并存放到设置的目录中

操作cookie

什么情况下回用到cookie操作?当开发人员开发一个功能,当用户登录后,会将用户的用户名写入浏览器cookie,指定key为username,就可以通过get_cookies()找到username,打印value。

url='https://www.youdao.com/'driver=webdriver.Chrome()driver.get(url)driver.maximize_window()driver.implicitly_wait(10)# #获得cookiedriver.add_cookie({'name':'Login_User','value':'Password'})cookie=driver.get_cookies()print("所有Cookie为",cookie)#获取name为Login_User的cookieone_cookie=driver.get_cookie('Login_User')print("Login_User的Cookie为",one_cookie)# "删除name为Login_User的cookiedriver.delete_cookie('Login_User')surplus_cookies=driver.get_cookies()print("剩余的cookie为:",surplus_cookies)driver.delete_all_cookies()surplus_cookies=driver.get_cookies()print("剩余的cookie为:",surplus_cookies)driver.quit()

返回结果为

所有Cookie为[{'domain': 'www.youdao.com','httpOnly': False,'name': '___rl__test__cookies','path': '/','secure': False,'value': '1662293521877'}, {'domain': '.youdao.com','expiry': 1696853521,'httpOnly': False,'name': 'OUTFOX_SEARCH_USER_ID','path': '/','secure': False,'value': '"555592633@10.108.162.135"'}, {'domain': 'www.youdao.com','httpOnly': False,'name': 'Login_User','path': '/','secure': True,'value': 'Password'}, {'domain': '.youdao.com','expiry': 1696853520,'httpOnly': False,'name': 'OUTFOX_SEARCH_USER_ID_NCOO','path': '/','secure': False,'value': '1883563674.2397'}]Login_User的Cookie为 {'domain': 'www.youdao.com','httpOnly': False,'name': 'Login_User','path': '/','secure': True,'value': 'Password'}剩余的cookie为: [{'domain': 'www.youdao.com','httpOnly': False,'name': '___rl__test__cookies','path': '/','secure': False,'value': '1662293521877'}, {'domain': '.youdao.com','expiry': 1696853521,'httpOnly': False,'name': 'OUTFOX_SEARCH_USER_ID','path': '/','secure': False,'value': '"555592633@10.108.162.135"'}, {'domain': '.youdao.com','expiry': 1696853520,'httpOnly': False,'name': 'OUTFOX_SEARCH_USER_ID_NCOO','path': '/','secure': False,'value': '1883563674.2397'}]剩余的cookie为: []调用Javascript

可以用来控制浏览器滚动条

url='https://www.baidu.com/'driver=webdriver.Chrome()driver.get(url)driver.find_element_by_id('kw').send_keys("selenium")driver.find_element_by_id('su').click()driver.set_window_size(600,600)#通过js设置浏览器窗口的滚动条位置js="window.scrollTo(500,500);"driver.execute_script(js)

 窗口截图url='https://www.baidu.com/'driver=webdriver.Chrome()driver.get(url)driver.find_element_by_id('kw').send_keys("selenium")driver.find_element_by_id('su').click()sleep(2)driver.get_screenshot_as_file("C:\\Users\\yangyl13\\Desktop\\3.png")driver.quit()关闭窗口

driver.quit() #退出相关驱动程序,关闭所有窗口

driver.close()#关闭单个窗口。

验证码处理

1、测试环境去掉验证码

2、万能验证码

3、验证码识别技术 如python-tesseract

4、记录cookie

下拉框选择from selenium.webdriver.support.select import SelectSelect(driver.find_element_by_id('')).select_by_index('2')#根据下拉框索引选择Select(driver.find_element_by_id('')).select_by_value('Python')#根据下拉框value属性选择Select(driver.find_element_by_id('')).select_by_visible_text('Python')#根据下拉框可见文本选择
本文链接地址:https://www.jiuchutong.com/zhishi/297633.html 转载请保留说明!

上一篇:Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战(如何用python制作人工智能)

下一篇:选项式 API 和组合式 API的区别(选项式api和组合式api哪个好)

  • 什么公司需要缴纳印花税
  • 建筑业固定资产折旧费用科目是什么
  • 增值税查询校验码是什么
  • 有形动产租赁服务属于现代服务吗
  • 发票税率开错了3%开成5%怎么办
  • 怎么增加资产减少负债
  • 大凭证小凭证
  • 个人所得税申报错误如何更正申报
  • 个人独资企业有股权吗
  • 个税年度累计计算器
  • 无追索权保理占用谁的额度
  • 林业局会计咋样做账
  • 软件委托开发合同印花税
  • 跨年度费用报销违反什么规定
  • 计提工资数大于实际支付数怎么办?
  • 买一送一的增值税如何计算例题
  • 发票联丢失用抵扣联做账可以吗
  • 不征税收入税屋
  • 小规模纳税人季度销售额不超过30万免征
  • 非正常损失的购进货物进项税不能抵扣
  • 开票资料没有电话号码可以写法人名字吗
  • 30万以下免征附加税包含30万吗
  • 出口佣金会计分录
  • 开票资料地址填营业执照
  • 报销差旅费抵扣进项税分录
  • 印花税零申报怎么申报不了
  • 销售单怎么设置打几行
  • 个体工商户网上报税流程
  • 出租包装物和出借包装物的摊销额
  • 金税三期啥意思
  • win10 kb5005611
  • 广告费和业务宣传费
  • 月底财务为什么要关账,暂时开不了发票
  • 股东分红的会计科目怎么做
  • 快启动u盘怎么打开
  • Win10 20H2 Beta 预览版 19042.782正式推送(附更新内容)
  • PHP:curl_multi_info_read()的用法_cURL函数
  • 长期借款利息的会计科目
  • 报销员工餐费属于哪个科目
  • 来料加工业务的会计处理
  • php imagecopy
  • 事业单位增值税可以抵扣吗
  • php连接数据库的基本步骤是什么
  • 以小物件为话题写出背后的故事
  • 基于python语言
  • 报销货物运输费需要什么凭证
  • 电子税务局能不能逾期申报个税
  • mysql 分片优缺点
  • 进项税额转出的会计分录怎么做
  • 小规模纳税人企业所得税怎么算
  • 会计上需要结转的科目
  • 再保险业务范围
  • 附加税多计提了怎么做分录
  • 车辆罚款单可作为费用报销吗
  • 工资及福利费科目
  • 损益类科目明细账怎么结账
  • 期末调汇汇兑损益科目
  • 残保金工资总额是按计提还是发放
  • 收付转三种凭证怎么装订
  • 负数发票跨月怎么作废
  • 累计折旧怎么算出来
  • win7系统如何打开
  • mac更改复制快捷键
  • win7系统设置wifi热点
  • ubuntu sudo apt
  • 用xp系统打造
  • mac 默认设置
  • linux系统坏了怎么恢复数据
  • windows7怎么解除密码
  • window7iis配置步骤
  • linux生成网卡配置文件
  • python提供三种基本数值类型
  • unity怎么导入3d模型
  • asynctask优缺点
  • unity手柄圆盘
  • 发票税额小数点打印不全能报销吗
  • 一季度土地市场
  • 一个公司怎么算利润
  • 财政法和经济法的关系
  • 2021税务零申报流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设