Selenium学习

Selenium学习记录

算是正式入职的第一周,大四党有点战战兢兢,算是记录一下学习的东西吧。

1.Selenium是什么?

百度百科:“Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本”
总之,selenium是用于web自动化测试的工具集,通过驱动浏览器代替人工完成兼容性测试或功能回归测试,支持多种浏览器及多语言开发。
然后,是selenium和webdriver的关系。简单的说,就是selenium2合并了selenium1和webdriver,目前在测试领域,通常所说的selenium实际上就是webdriver,然后合并后自然是更加强大了,webdriver的API更加简洁、简单,驱动浏览器更加高效,还解决了1.0中比较难处理的诸如文件上传、弹出框处理等。
(这些概念,了解一下就好,这里属于摘录的平山大佬的简洁合并版,下面正文要来了)

2.安装selenium(Chrome为例)

  • 安装Chrome浏览器(最好是在官网下载,别去下载站)
  • Chrome浏览器地址栏输入chrome://settings/help,获取版本信息
  • 下载对应的driver(driver下载链接),选版本最接近的一个(最后一位最接近,前三位一样),然后将解压后的chromedriver.exe放到Chrome浏览器的同级目录下(Chrome快捷图标右键点打开文件所在位置,然后粘贴就行)
  • 添加环境变量,就是Chrome.exe那个文件位置,添加到环境变量里
  • 最后一步,pip install selenium
    完工测试:
from selenium import webdriver
# 如果Chrome浏览器被打开并自动访问了百度网址,那么安装就成功了。
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

3.元素定位方式

元素定位,是操作元素的第一步,也是WebUI自动化的难点和核心。
selenium提供了内置的方法完成对待操作元素的定位,每类又可分为定位单个元素和定位多个元素,里国外还提供了2个私有方法。
定位单个元素:

 - find_element_by_id
 - find_element_by_name
 - find_element_by_xpath
 - find_element_by_link_text
 - find_element_by_partial_link_text
 - find_element_by_tag_name
 - find_element_by_class_name
 - find_element_by_css_selector

定位多个元素:

 - find_elements_by_id
 - find_elements_by_name
 - find_elements_by_xpath
 - find_elements_by_link_text
 - find_elements_by_partial_link_text
 - find_elements_by_tag_name
 - find_elements_by_class_name
 - find_elements_by_css_selector

两个私有方法:find_element()和find_elements()

4.常用操作类型及方法

开展WebUI自动化的核心思路,无非就是找到元素,然后操作元素这两个内容。操作方法总体来说可大致分为4类,即浏览器操作、键盘操作、鼠标操作和js脚本。
(1)浏览器常用操作方法:
driver.maxmize_window() 窗口最大化
driver.back() 页面返回
driver.forword() 页面前进
(2)键盘常用操作:
send_keys() # Keys模拟键盘输入;模拟键盘按键、组合键等
ex:
from selenium.webdriver.common.keys import Keys
send_keys(Keys.ENTER) 按下回车键
send_keys(Keys.TAB) 按下Tab制表键
send_keys(Keys.SPACE) 按下空格键space
send_keys(Kyes.ESCAPE) 按下回退键Esc
send_keys(Keys.BACK_SPACE) 按下删除键BackSpace
send_keys(Keys.SHIFT) 按下shift键
send_keys(Keys.CONTROL) 按下Ctrl键
send_keys(Keys.ARROW_DOWN) 按下鼠标光标向下按键
send_keys(Keys.CONTROL,‘a’) 组合键全选Ctrl+A
send_keys(Keys.CONTROL,‘c’) 组合键复制Ctrl+C
send_keys(Keys.CONTROL,‘x’) 组合键剪切Ctrl+X
send_keys(Keys.CONTROL,‘v’) 组合键粘贴Ctrl+V
(3)鼠标常用操作方法:
在现实的自动化测试中,关于鼠标的操作不仅仅是click()单击操作,还有很多包含在ActionChains类中的操作。如下:

click(on_element=None)# 单击鼠标左键
click_and_hold(on_element=None)# 点击鼠标左键,不松开
context_click(on_element=None)# 右击鼠标点击元素elem,另存为等行为
double_click(on_element=None)# 双击鼠标点击元素elem,地图web可实现放大功能
drag_and_drop(source,target)# 拖拽到某个元素然后放开
drag_and_drop_by _offset(source,xoffset,yofset)# 拖拽到某个坐标然后松开
key_down(value,element=None)# 按下某个键盘上的键
key_up(value,element=None)# 松开某个键
move_to_element(elem)# 鼠标移动到一个元素上
click_and_hold(elem)# 按下鼠标左键在一个元素上
perform()# 在通过调用该函数执行ActionChains链中存储行为

(4)调用js脚本:
execute_script()# 执行js脚本完成特定操作

	js = "var q=document.documentElement.scrollTop=1200"
    driver.execute_script(js)  # 执行上面的js语句

5.元素等待

元素等待是为了解决如下场景的问题:脚本执行时,脚本的执行速度和页面元素的加载速度未必一致,也就是说,可能出现脚本已经运行到某个元素,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。元素等待本质是为了解决时序上不匹配的问题。

selenium的元素等待方法:

  1. 强制等待 time.sleep(x)
  2. 显式等待 WebDriverWait
  3. 隐式等待 implicitly_wait

其中,三种等待方法的作用和区别如下:
强制等待,也就是常说的死等待,使用time模块提供的sleep方法,脚本在等待sleep(x) x秒后才执行,此时脚本也许出现了无效等待,即元素已经出现,可以继续操作,但因指定的时间未到,脚本无法执行,因而,在实际Web UI开发中应杜绝sleep等待;

显式等待,WebDriver提供的针对元素级别的、灵活、智能的等待方法,通过配合until()、until_not()、ExpectedCondition等条件的使用,默认每500ms检查一次条件状态,可以及时将脚本从等待中唤醒,避免无效等待,在实际应用中推荐使用该方法。该等待的调用方法如下:
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

隐式等待,WebDriver提供的针对driver级别的适用整个生命周期的等待方法,该等待是全局设置,因而只需在实例化driver后设置一次即可。从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,driver要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,driver也会继续等待页面上其他无关元素,直至整个页面加载完毕。因而,与显式等待相比,可能出现无效等待的情况。
ex:

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

def webdriver_wait():
	dr = webdriver.Chrome()
	# 隐式等待就在实例化driver后,设置一次即可应用全局
	# dr.implicitly_wait(5)
	dr.get('https://www.baidu.com')
	try:
		ele = WebDriverWait(dr,10).until(EC.presence_of_element_located((By.ID,"kw")))
		ele.send_keys("python selenium")
		time.sleep(1)
	finally:
		dr.quit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值