• WebDriver高阶API(5)


    10、UI对象库
    定位数据与程序分离

    新建一个名叫GoGouTest的工程,工程下新建三个文件,分别为SoGou.py、ObjectMap.py以及UiObjectMap.ini

    UiObjectMap.ini 页面元素定位表达式配置文件
    [sogou]
    searchBox=id>query
    searchButton=id=stb

    ObjectMap.py 表示ObjexctMap工具类文件,供测试程序调用

    #encoding=utf-8
    from selenium.webdriver.support.ui import WebDriverWait
    import ConfigParser
    import os
    
    class ObjectMap(object):
        def __init__(self):
            #获取存放页面元素定位方式及定位表达式的配置文件所在绝对路径
            #os.path.abspath(__file__)表示获取当前文件所在路径目录
            self.uiObjectMapPath = os.path.dirname(os.path.abspath(__file__))+"\UiObjectMap.ini"
            print self.uiObjectMapPath
    
        def getElementObject(self,driver,webSiteName,elementName):
            try:
                #创建一个读取配置文件的实例
                cf = ConfigParser.ConfigParser()
                #将配置文件内容加载到内存
                cf.read(self.uiObjectMapPath)
                #根据section和option获取配置文件中页面元素的定位方式及定位表达式组成的字符串,并用">"分割
                locators = cf.get(webSiteName,elementName).split(">")
                #得到定位方式
                locatorMethod = locators[0]
                #得到定位表达式
                locatorExpression = locators[1]
                print locatorMethod,locatorExpression
                #通过显式等待方式 获取页面元素
                element = WebDriverWait(driver,10).until(lambda x: x.find_element(locatorMethod,locatorExpression))
            except Exception,e:
                raise e
            else:
                #当页面元素被找到后,将该页面元素对象返回给调用者
                return element

    SoGou.py中调用ObjectMap.py工具类实现测试逻辑

    #encoding=utf-8
    from selenium import webdriver
    import unittest
    import time,traceback
    from ObjectMap import ObjectMap
    
    class TestSoGouByObjectMap(unittest.TestCase):
    
        def setUp(self):
            self.obj = ObjectMap()
            #启动浏览器
            self.driver = webdriver.Ie(executable_path="D:\IEDriverServer")
    
        def test_SoGouSearch(self):
            url = "http://www.sogou.com"
            #访问搜狗首页
            self.driver.get(url)
            try:
                #查找页面输入框
                searchBox = self.obj.getElementObject(self.driver,"sogou","searchBox")
                #在找到的搜索框中输入关键字
                searchBox.send_keys("World of Warcraft")
                #查找搜索按钮
                searchButton = self.obj.getElementObject(self.driver,"sogou","searchButton")
                #单击找到的搜索按钮
                searchButton.click()
                #等待2秒,以便页面加载完成
                time.sleep(2)
                #断言
                self.assertTrue("World of Warcraft" in self.driver.page_source,"assertError!!!")
            except Exception,e:
                print traceback.print_exc()
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == "__main__":
        unittest.main()

    11、精确比较页面截图图片
    安装pillow,命令行输入pip install pillow
    命令行进行Python交互模块,执行 from PIL import Image没有报错则安装成功

    #encoding=utf-8
    import unittest,time
    from selenium import webdriver
    from PIL import Image
    
    class ImageCompare(object):
        """
        本类实现 了对两张图片通过像素比对的算法,获取文件的像素个数大小,然后使用循环的方式将两张
        图片的所有项目进行一一对比,并计算比对结果的相似度的百分比
        """
        def make_regalur_image(self,img,size=(256,256)):
            #将图片尺寸强身重置为指定的size大小
            #然后再将其转换成RGB值
            return img.resize(size).convert("RGB")
    
        def split_image(self,img,part_size=(64,64)):
            #将图片按给定的大小切分
            w,h = img.size
            pw,ph = part_size
            assert w % pw == h % ph == 0
            return [img.crop((i,j,i+pw,j+ph)).copy() for i in xrange(0,w,pw) for j in xrange(0,h,pw)]
    
        def hist_similar(self,lh,rh):
            #统计切分后的每部分图片的相似度频率曲线
            assert len(lh) == len(rh)
            return sum(1-(0 if 1 == r else float(abs(1-r))/ max(1,r)) for l,r in zip(lh,rh)) / len(lh)
    
        def calc_similar(self,li,ri):
            #计算两张图片的相似度
            return sum(self.hist_similar(l.histogram(),r.histogram()) for l,r in zip(self.split_image(li),self.split_image(ri))) / 16.0
    
        def calc_similar_by_path(self,lf,rf):
            li,ri = self.make_regalur_image(Image.open(lf)),self.make_regalur_image(Image.open(rf))
            return self.calc_similar(li,ri)
    
    class TestDemo(unittest.TestCase):
    
        def setUp(self):
            self.IC = ImageCompare()
            self.driver = webdriver.Ie(executable_path = "D:\IEDriverServer")
    
        def test_ImageComparison(self):
            url = "http://www.sogou.com"
            self.driver.get(url)
            time.sleep(2)
            #截取第一次访问搜狗首页的图片,并保存在本地
            self.driver.save_screenshot("D:\test\test\sogou1.png")
            self.driver.get(url)
            time.sleep(3)
            #截取第二次访问搜首页的图片,并保存在本地
            self.driver.save_screenshot("D:\test\test\sogou2.png")
            #打印两张比对后的相似度,100表示完全匹配
            print self.IC.calc_similar_by_path("D:\test\test\sogou1.png","D:\test\test\sogou2.png") * 100
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == "__main__":
        unittest.main()
  • 相关阅读:
    二叉树的遍历以及创建——by leona
    利用图像压缩模型抵御对抗样本 by ch
    卡尔曼滤波器及其扩展的个人学习笔记~
    用GAN进行图像压缩 by ch
    用深度学习进行图像压缩 by ch
    3D目标检测&6D姿态估计之SSD-6D算法--by leona
    如何搭建三维重建工程体系
    C++面对对象(一)
    Pybind11教程
    C++的debug和release区别
  • 原文地址:https://www.cnblogs.com/test-chen/p/10644529.html
Copyright © 2020-2023  润新知