实验名称:Selenium自动化测试
实验目的: (1)安装 SeleniumIDE 插件
(2)学会使用 SeleniumIDE 录制脚本和导出脚本
(3)编写 Selenium WebDriver 程序,利用程序实现WEB自动化测试。
1、百度搜索
打开www.baidu.com页面,激活当前窗口,输出提示文字:百度首页已打开;通过id查找搜索框,在搜索框内键入关键词java并提交搜索;获取页面中文本:百度已为您找到相关结果约 xxx 个;执行js脚本,显示一个信息提示框提示用户已经找到相关结果。
import time
from selenium import webdriver
driver=webdriver.Chrome("chromedriver.exe")
try:
driver.implicitly_wait(5)
driver.get(" http://www.baicicom")#激活当前窗口
driver.switch_to.window(driver.cunrert_window_handle)
print('百度首页已打开: ', driver.title)
#通过id-kw查找搜索框
search_input=driver.find_element_by_id('kw')#找到后,键入 java 并提交搜索
search_input.send_keys('java')
search_input.submit()
#获取页面中"百度为您找到相关结果约55,800,000个"相关文字的元素
nums = driver.fnd_element_by_class_name('nums')
#输出找到的相关结果约55,800,000个
print(" ---------".nums.text)
#再次激活窗口
driver.switch_to.window(driver.cunrert_window_handle)
#执行脚本,显示一个信息提示框提示用户
wait_seconds = 10
driver.execue_script("window.alert(\"{},{}秒后关\")".format(nums.text.replace("\n", "$"), wait_seconds))
time.sleep(wait_seconds)#操作等待超时时间,10秒,默认等待5秒
finally:
driver.quit()
2、模块导入(登录方法)
1)把登录写成一个登录类,里面写个登录的方法,保存文件为login_pub.py
2)调用登录公共方法
class Login_Blog():
def __init__(self, driver):
self.driver = driver
def input_user(self, username):
self.driver.find_element_by_id("mat-input-0").clear()
self.driver.find_element_by_id("mat-input-0").send_keys(username)
def input_psw(self, psw):
self.driver.find_element_by_id("mat-input-1").clear()
self.driver.find_element_by_id("mat-input-1").send_keys(psw)
def click_button(self):
self.driver.find_element_by_id("mat-button-wrapper").click()
def login(self, username, psw):
self.input_user(username)
self.input_psw(psw)
self.click_button()
//
from selenium import webdriver
import unittest
from login_pub import Login_Blog
login_url = "https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2F"
class TestLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get(login_url)
def tearDown(self):
self.driver.quit()
def test_login(self):
Login_Blog(self.driver).login("xxx", "111")
self.driver.find_element()
if __name__ == "__main__":
unittest.main()
3、捕获异常
在定位元素的时候,经常会遇到各种异常,为什么会发生这些异常,遇到异常又该如何处理呢?通过学习selenium的exceptions模块,了解异常发生的原因。
(1)发生异常
- 打开博客首页,定位“新随笔”元素,此元素id=“blog_nav_newpost”
- 为了故意让它定位失败,我在元素属性后面加上xx
- 运行失败后如下图所示,程序在查找元素的这一行发生了中断,不会继续执行click事件了
(2)捕获异常
- 为了让程序继续执行,我们可以用try…except…捕获异常。捕获异常后可以打印出异常原因,这样以便于分析异常原因。
- 从如下异常内容可以看出,发生异常原因是:NoSuchElementException
- selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {“method”:“id”,“selector”:“blog_nav_newpostxx”}
-
从selenium.common.exceptions 导入 NoSuchElementException类。
(3)selenium常见异常 - NoSuchElementException:没有找到元素
- NoSuchFrameException:没有找到iframe
- NoSuchWindowException:没找到窗口句柄handle
- NoSuchAttributeException:属性错误
- NoAlertPresentException:没找到alert弹出框
- ElmentNotVisibleException:元素不可见
- ElementNotSelectableException:元素没有被选中
- TimeoutException:查找元素超时
#coding:utf-8
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
driver=webdriver.Chrome()
driver.get("http://www.cnblogs.com/yoyoketang/")
try:
element=driver.find_element("id","blog_nav_newpostxx")
except NoSuchElementException as msg:
print (u"查找元素异常%s"%msg)
else:
element.click()
4、异常后截图
在执行用例过程中由于是无人值守的,用例运行报错的时候,我们希望能对当前屏幕截图,留下证据。
在写用例的时候,最后一步是断言,可以把截图的动作放在断言这里,那么如何在断言失败后截图呢?
(1)截图方法
1)get_screenshot_as_file(self, filename)
–这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。
filename参数是保存文件的路径。
Usage:
driver.get_screenshot_as_file(’/Screenshots/foo.png’)
2)get_screenshot_as_base64(self)
–这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。
比如,想把截图放到html测试报告里。
Usage:
driver.get_screenshot_as_base64()
3)get_screenshot_as_png(self)
–这个是获取屏幕截图,保存的是二进制数据,很少用到。
Usage:
driver.get_screenshot_as_png()
(2)异常后截图
1)为了能抛异常,把定位登录按钮的id换了个错的id。
2)给图片命名时候加个时间戳,避免同一个文件名称被覆盖掉。
3)文件路径,这里直接写的文件名称,就是跟当前的脚本同一个路径。如果图片输出到其它文件路径,需要些文件的绝对路径了。
4)截图的结果,如果没截到图返回False,截图成功会返回True。
(3)selenium实例
1)在unittest框架里写用例的时候,我们希望在断言失败的时候,对当前屏幕截图。
2)如果加try…except捕获异常后结果,此时所有的测试用例都是通过的了,会影响测试结果。解决办法其实很简单,再把异常抛出来就行了。
#coding:utf-8
from unittest import TestCase
from selenium import webdriver
import time,unittest
from selenium.webdriver.support import expected_conditions as EC
class Login(unittest.TestCase):
def setUp(self):
url_login="https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2F"
self.driver=webdriver.Chrome()
self.driver.get(url_login)
def test_01(self):
try:
self.driver.find_element_by_id("mat-input-0").send_keys(u"上海-悠悠")
self.driver.find_element_by_id("mat-input-1").send_keys("xxx")
self.driver.find_element_by_class_name("mat-button-wrapper").click()
time.sleep(3)
locator=("id","nav_left")
result=EC.text_to_be_present_in_element(locator,u"上海-悠悠")(self.driver)
self.assertFalse(result)
except Exception as msg:
print(u"异常原因%s"%msg)
nowTime=time.strftime("%Y%m%d.%H.%M.%S")
self.driver.get_screenshot_as_file('%s.jpg' %nowTime)
raise
def tearDown(self):
self.driver.quit()
if __name__ == "__main__":
unittest.main()
5. GitHub的登录测试
import pytest
from selenium import webdriver
def test_02():
driver=webdriver.Chrome()
driver.get("https://github.com/login")
assert"Github"in driver.title
driver.implicitly_wait(10)
driver.find_element_by_id("login_field").send_keys("Ritine")
driver.find_element_by_id("password").send_keys("1111")
driver.find_element_by_name("commit").click()
name=driver.find_element_by_xpath("//meta[@name'user-login']").get_attribute("content")
print("获取我的账号:%s"%name)
if name=="Ritine":
print("登录成功:")
else:
print("登录失败!")
driver.find_element_by_xpath("//summary[@class='Header-link'][@aria-lable='View profile and more']").click()
driver.find_element_by_xpath("//button[@class='dropdown-item dropdown-signout']").click()
driver.quit()
if __name__ == "__main__":
pytest.main(['test_02.py','--html=report02.html'])