1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python【模块】Selenium 自动化测试Web 工具

python【模块】Selenium 自动化测试Web 工具

时间:2019-03-11 09:02:03

相关推荐

python【模块】Selenium 自动化测试Web 工具

python 模块 Selenium 自动化测试 Web 工具

文章目录

python 模块 Selenium 自动化测试 Web 工具1. Selenium简介2. 安装Selenium3. 下载浏览器驱动4. 环境变量5. 参数6. 定位元素的8种方式7. 控制浏览器操作方法8. 键盘事件9. 获取断言信息10. 浏览器操作11. 设置元素等待11.1 显示等待11.2 隐式等待 12. 多窗口切换13. 警告框处理14. 定位一组元素15. 多表单切换16. 下拉框选择操作17. 文件上传18. cookie操作19. 调用JavaScript代码20. 窗口截图21. 关闭浏览器22. 封装23. selenium 和 requests 结合24. 禁止加载图片和JS25. 解压 gzip26. 监听请求

1. Selenium简介

Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。可执行系统如Windows、Linux、IOS、Android等。

相关网站:

githubpypi帮助文档官网

2. 安装Selenium

pip install Selenium

3. 下载浏览器驱动

Firefox浏览器驱动:geckodriverChrome浏览器驱动:chromedriver ,or chromedriver 2IE浏览器驱动:IEDriverServerEdge浏览器驱动:MicrosoftWebDriverOpera浏览器驱动:operadriverPhantomJS浏览器驱动:phantomjs

需要把浏览器驱动放入系统路径中,或者直接告知selenuim的驱动路径

4. 环境变量

设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: F:\GeckoDriver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。

我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“F:\GeckoDriver”目录添加到Path的值中。比如:Path字段;F:\GeckoDriver

5. 参数

另外启动浏览器,可以设置一些参数,比如无界面之类的,详细参考

可以测试是否正常使用,以下代码:

from selenium import webdriverdriver = webdriver.Firefox() # Firefox浏览器# driver = webdriver.Firefox("驱动路径")driver = webdriver.Chrome() # Chrome浏览器driver = webdriver.Ie() # Internet Explorer浏览器driver = webdriver.Edge()# Edge浏览器driver = webdriver.Opera()# Opera浏览器driver = webdriver.PhantomJS() # PhantomJS# 打开网页driver.get(url) # 打开url网页 比如 driver.get("")

6. 定位元素的8种方式

demo:

假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。

<html><head><body link="#0000cc"><a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})"><form id="form" class="fm" name="f" action="/s"><span class="soutu-btn"></span><input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">

通过id定位:

dr.find_element_by_id("kw")

通过name定位:

dr.find_element_by_name("wd")

通过class name定位:

dr.find_element_by_class_name("s_ipt")

通过tag name定位:

dr.find_element_by_tag_name("input")

通过xpath定位,xpath定位有N种写法,这里列几个常用写法:

dr.find_element_by_xpath("//*[@id='kw']")dr.find_element_by_xpath("//*[@name='wd']")dr.find_element_by_xpath("//input[@class='s_ipt']")dr.find_element_by_xpath("/html/body/form/span/input")dr.find_element_by_xpath("//span[@class='soutu-btn']/input")dr.find_element_by_xpath("//form[@id='form']/span/input")dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")

通过css定位,css定位有N种写法,这里列几个常用写法:

dr.find_element_by_css_selector("#kw")dr.find_element_by_css_selector("[name=wd]")dr.find_element_by_css_selector(".s_ipt")dr.find_element_by_css_selector("html > body > form > span > input")dr.find_element_by_css_selector("span.soutu-btn> input#kw")dr.find_element_by_css_selector("form#form > span > input")

接下来,我们的页面上有一组文本链接。

dr.find_element_by_link_text("新闻")dr.find_element_by_link_text("hao123")

通过link text定位:

dr.find_element_by_link_text("新闻")dr.find_element_by_link_text("hao123")

通过partial link text定位:

dr.find_element_by_partial_link_text("新")dr.find_element_by_partial_link_text("hao")dr.find_element_by_partial_link_text("123")

7. 控制浏览器操作方法

demo:

from selenium import webdriverfrom time import sleep#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口browser = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")#2.通过浏览器向服务器发送URL请求browser.get("/")sleep(3)#3.刷新浏览器browser.refresh()#4.设置浏览器的大小browser.set_window_size(1400,800)#5.设置链接内容element=browser.find_element_by_link_text("新闻")element.click()element=browser.find_element_by_link_text("“下团组”时间")element.click()

8. 键盘事件

Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作。

常用的键盘操作如下:

组合键的使用

9. 获取断言信息

不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。

demo:

from selenium import webdriverfrom time import sleepdriver = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")driver.get("")print('Before search================')# 打印当前页面titletitle = driver.titleprint(title)# 打印当前页面URLnow_url = driver.current_urlprint(now_url)driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()sleep(1)print('After search================')# 再次打印当前页面titletitle = driver.titleprint(title)# 打印当前页面URLnow_url = driver.current_urlprint(now_url)# 获取结果数目user = driver.find_element_by_class_name('nums').textprint(user)#关闭所有窗口driver.quit()

打印输出结果

Before search================百度一下,你就知道/After search================selenium_百度搜索/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium&rsv_pq=a1d51b980000e36e&rsv_t=a715IZaMpLd1w92I4LNUi7gKuOdlAz5McsHe%2FSLQeBZD44OUIPnjY%2B7pODM&rqlang=cn&rsv_enter=0&rsv_sug3=8&inputT=758&rsv_sug4=759搜索工具百度为您找到相关结果约7,170,000个————————————————

10. 浏览器操作

browser.forward() # 向前browser.back() # 返回browser.fullscreen_window() # 全屏browser.maximize_window() # 最大化browser.minimize_window() # 最小化

11. 设置元素等待

11.1 显示等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

from selenium import webdriverfrom mon.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Firefox()driver.get("")element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))element.send_keys('selenium')driver.quit()

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

driver:浏览器驱动。timeout:最长超时时间,默认以秒为单位。poll_frequency:检测的间隔(步长)时间,默认为0.5S。ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常。WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。until(method, message=‘’)调用该方法提供的驱动程序作为一个参数,直到返回值为True。until_not(method, message=‘’)调用该方法提供的驱动程序作为一个参数,直到返回值为False。

在本例中,通过as关键字将expected_conditions重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

11.2 隐式等待

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。

from selenium import webdriverdriver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")

12. 多窗口切换

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。

driver.switch_to_window("windowName")driver.switch_to_frame("frameName")

以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。

#先通过xpth定位到iframexf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')#再将定位对象传给switch_to_frame()方法driver.switch_to_frame(xf)

一旦我们完成了frame中的工作,我们可以这样返回父frame:

driver.switch_to_default_content()

demo:

from selenium import webdriverimport timedriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")driver.implicitly_wait(10)driver.get("")#1.获得百度搜索窗口句柄sreach_windows = driver.current_window_handledriver.find_element_by_link_text('登录').click()driver.find_element_by_link_text("立即注册").click()#1.获得当前所有打开的窗口的句柄all_handles = driver.window_handles#3.进入注册窗口for handle in all_handles:if handle != sreach_windows:driver.switch_to.window(handle)print('跳转到注册窗口')driver.find_element_by_name("account").send_keys('123456789')driver.find_element_by_name('password').send_keys('123456789')time.sleep(2)driver.quit()

13. 警告框处理

在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。

demo:

from selenium import webdriverfrom mon.action_chains import ActionChainsimport timedriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")driver.implicitly_wait(10)driver.get('')# 鼠标悬停至“设置”链接link = driver.find_element_by_link_text('设置')ActionChains(driver).move_to_element(link).perform()# 打开搜索设置driver.find_element_by_link_text("搜索设置").click()#在此处设置等待2s否则可能报错time.sleep(2)# 保存设置driver.find_element_by_class_name("prefpanelgo").click()time.sleep(2)# 接受警告框driver.switch_to.alert.accept()driver.quit()

14. 定位一组元素

定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。

from selenium import webdriverfrom time import sleepdriver =webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")driver.get("")driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()sleep(1)#1.定位一组元素elements = driver.find_elements_by_xpath('//div/h3/a')print(type(elements))#2.循环遍历出每一条搜索结果的标题for t in elements:print(t.text)element=driver.find_element_by_link_text(t.text)element.click()sleep(3)driver.quit()

15. 多表单切换

在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

<html><body>...<iframe id="x-URS-iframe" ...><html><body>...<input name="email" >

126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。

from selenium import webdriverdriver = webdriver.Chrome()driver.get("")driver.switch_to.frame('x-URS-iframe')driver.find_element_by_name("email").clear()driver.find_element_by_name("email").send_keys("username")driver.find_element_by_name("password").clear()driver.find_element_by_name("password").send_keys("password")driver.find_element_by_id("dologin").click()driver.switch_to.default_content()driver.quit()

switch_to.frame()默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。

……#先通过xpth定位到iframexf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')#再将定位对象传给switch_to.frame()方法driver.switch_to.frame(xf)……driver.switch_to.parent_frame()

16. 下拉框选择操作

导入选择下拉框Select类,使用该类处理下拉框操作。

from selenium.webdriver.support.select import Select

Select类的方法

有时我们会碰到下拉框,WebDriver提供了Select类来处理下拉框。

from selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom time import sleepdriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")driver.implicitly_wait(10)driver.get('')#1.鼠标悬停至“设置”链接driver.find_element_by_link_text('设置').click()sleep(1)#2.打开搜索设置driver.find_element_by_link_text("搜索设置").click()sleep(2)#3.搜索结果显示条数sel = driver.find_element_by_xpath("//select[@id='nr']")Select(sel).select_by_value('50') # 显示50条sleep(3)driver.quit()

17. 文件上传

对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传。

通过send_keys()方法来实现文件上传:

from selenium import webdriverimport osdriver = webdriver.Firefox()file_path = 'file:///' + os.path.abspath('upfile.html')driver.get(file_path)# 定位上传按钮,添加本地文件driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')driver.quit()

18. cookie操作

有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息。

WebDriver操作cookie的方法:

demo:

from selenium import webdriverimport timebrowser = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")browser.get("")#1.打印cookie信息print('=====================================')print("打印cookie信息为:")print(browser.get_cookies)#2.添加cookie信息dict={'name':"name",'value':'Kaina'}browser.add_cookie(dict)print('=====================================')print('添加cookie信息为:')#3.遍历打印cookie信息for cookie in browser.get_cookies():print('%s----%s\n' %(cookie['name'],cookie['value']))#4.删除一个cookiebrowser.delete_cookie('name')print('=====================================')print('删除一个cookie')for cookie in browser.get_cookies():print('%s----%s\n' %(cookie['name'],cookie['value']))print('=====================================')print('删除所有cookie后:')#5.删除所有cookie,无需传递参数browser.delete_all_cookies()for cookie in browser.get_cookies():print('%s----%s\n' %(cookie['name'],cookie['value']))time.sleep(3)browser.close()

19. 调用JavaScript代码

虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。

用于调整浏览器滚动条位置的JavaScript代码如下:

<!-- window.scrollTo(左边距,上边距); -->window.scrollTo(0,450);

window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:

from selenium import webdriverfrom time import sleep#1.访问百度driver=webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")driver.get("")#2.搜索driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()#3.休眠2s目的是获得服务器的响应内容,如果不使用休眠可能报错sleep(2)#4.通过javascript设置浏览器窗口的滚动条位置js="window.scrollTo(100,450);"driver.execute_script(js)sleep(3)driver.close()

通过浏览器打开百度进行搜索,并且提前通过set_window_size()方法将浏览器窗口设置为固定宽高显示,目的是让窗口出现水平和垂直滚动条。然后通过execute_script()方法执行JavaScripts代码来移动滚动条的位置。

滚动条上下左右滚动代码演示

from selenium import webdriverfrom time import sleepdriver=webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")driver.set_window_size(400,400)driver.get("")#2.搜索# driver.find_element_by_id("kw").send_keys("selenium")# driver.find_element_by_id("su").click()#3.休眠2s目的是获得服务器的响应内容,如果不使用休眠可能报错sleep(10)#4 滚动左右滚动条---向右js2 = "var q=document.documentElement.scrollLeft=10000"driver.execute_script(js2)sleep(15)#5 滚动左右滚动条---向左js3 = "var q=document.documentElement.scrollLeft=0"driver.execute_script(js3)sleep(15)#6 拖动到滚动条底部---向下js = "var q=document.documentElement.scrollTop=10000"driver.execute_script(js)sleep(15)#7 拖动到滚动条底部---向上js = "var q=document.documentElement.scrollTop=0"driver.execute_script(js)sleep(15)driver.close()

20. 窗口截图

自动化用例是由程序去执行的,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。WebDriver提供了截图函数get_screenshot_as_file()来截取当前窗口。

截屏方法:

from selenium import webdriverfrom time import sleepdriver =webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")driver.get('')driver.find_element_by_id('kw').send_keys('selenium')driver.find_element_by_id('su').click()sleep(2)#1.截取当前窗口,并指定截图图片的保存位置driver.get_screenshot_as_file("D:\\baidu_img.jpg")driver.quit()

21. 关闭浏览器

在前面的例子中我们一直使用quit()方法,其含义为退出相关的驱动程序和关闭所有窗口。除此之外,WebDriver还提供了close()方法,用来关闭当前窗口。例多窗口的处理,在用例执行的过程中打开了多个窗口,我们想要关闭其中的某个窗口,这时就要用到close()方法进行关闭了。

22. 封装

将各种方式获取元素的进行封装,以类似get_by_browser('class:class_name')进行调用:

def get_by_browser(browser, by):by_kv = by.split(':')k, v = by_kv[0], by_kv[1]by_case = {"id": lambda x: browser.find_element_by_id(x),"name": lambda x: browser.find_element_by_name(x),"xpath": lambda x: browser.find_element_by_xpath(x),"link_text": lambda x: browser.find_element_by_link_text(x),"partial_link_text": lambda x: browser.find_element_by_partial_link_text(x),"tag_name": lambda x: browser.find_element_by_tag_name(x),"class_name": lambda x: browser.find_element_by_class_name(x),"css_selector": lambda x: browser.find_element_by_css_selector(x)}try:browser = by_case[k](v)except KeyError as e:browser = browser.find_element_by_tag_name('html')return browser

以上边的功能也可用以下方式实现:

from mon.by import By# browser.find_element(by='id', value=None)browser.find_element(By.ID, "content")

23. selenium 和 requests 结合

网页渲染后,单纯的 HTTP 请求可以使用 Requests 库来操作。还有种情况中,登录有复杂的验证码如拖动图像块、手机验证码等,需要 selenium 配合并人工完成,登录之后再用 Requests 访问数据。

import requestss = requests.Session()selenium_user_agent = browser.execute_script("return navigator.userAgent;")s.headers.update({"user-agent": selenium_user_agent})for cookie in browser.get_cookies():s.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'])# 发起访问请求r = s.get(target_url)# browser.delete_all_cookies()

另外,上述登录验证码问题:

滑动验证,可以 Selenium 模拟滑动距离,图像梯度算法可判断图文验证,可以 Python AI 库识别

24. 禁止加载图片和JS

禁止加载图片和JS,可使用以下方法:

chrome_options = webdriver.ChromeOptions()prefs={'profile.default_content_setting_values': {'images':2,'javascript':2}}chrome_options.add_experimental_option("prefs", prefs)driver.switch_to.frame('ptlogin_iframe') # 切换框架页driver.implicitly_wait(10) # 自动检测,如果10秒未成功则报错# 通过文字定位元素b.find_element_by_xpath("//[text()='点我']")b.find_element_by_xpath("//*[contains(text(), '我')]")

25. 解压 gzip

想解压通过 gzip 压缩的请求返回数据可通过以下方法:

# 方法二,推荐import gzip# r 为 gzip 压缩的 bytesgzip.decompress(r)# ...# 方法二import zlib# r 为 gzip 压缩的 byteszlib.decompress(r, 16+zlib.MAX_WBITS)# ...

26. 监听请求

如果要监听浏览器的请求,可使用对 Selenium 三方封装Selenium Wire

# pip install selenium-wirefrom seleniumwire import webdriver # Import from seleniumwire# Create a new instance of the Chrome driverdriver = webdriver.Chrome()# Go to the Google home pagedriver.get('')# Access requests via the `requests` attributefor request in driver.requests:if request.response:print(request.url,request.response.status_code,request.response.headers['Content-Type'])'''/ 200 text/html; charset=.../images/branding/googlelo.../status?continue=http.../images/branding/googlelo.../gb/images/i2_2ec824b0.p.../gen_204?s=webaft&t=aft&a......'''

✈参考阅读:

/p/python-seleniumhttps://www.selenium.dev/https://selenium-python.readthedocs.io//weixin_36279318/article/details/79475388/p//1694.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。