软件测试与分析:Selenium自动化测试

  • Post author:
  • Post category:其他




实验名称: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,000print(" ---------".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'])



版权声明:本文为weixin_45780075原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。