poium测试库之JavaScript API封装原理 网络技术

铭镕小姐姐 3月前 199

poium一直我在维护的一个开源项目,它的定位是以极简的方式在自动化项目中Page Objects设计模式。我在之前的文章中也有介绍。

本篇文章主要介绍一个JavaScript元素操作的封装原理。

为什么要封装JavaScript的API?

因为有些场景下Selenium提供的API并不能满足我们需求。比如,滑动浏览滚动条,控制元素的显示/隐藏,日历控件的操作等,都可以通过JavaScrip实现,而且Selenium为我们提供了 execute_script()方法可以用来运行JavaScrip脚本。

旧的设计思路

先看旧的设计代码和调用。

# =====封装代码======class Page(object):

   def __init__(self, driver):
       self.driver = driver    def set_text(self, css_selector, value):
       """
       JavaScript API, Only support css positioning
       Simulates typing into the element.
       """
       js = """var elm = document.querySelector("{css}");
                   elm.style.border="2px solid red";
                   elm.value = "{value}";""".format(css=css_selector(), value=value)
       self.driver.execute_script(js)    def click(self, css_selector):
       """
       JavaScript API, Only support css positioning
       Click element.
       """
       js = """var elm = document.querySelector("{css}");
                  elm.style.border="2px solid red";
                  elm.click();""".format(css=css_selector())
       self.driver.execute_script(js)class CSSElement(object):

   def __init__(self, css):
       self.css = css    def __call__(self):
       return self.css# =======调用代码==============from selenium import webdriverclass baiduPage(Page):
   search_input = CSSElement("#kw")
   search_button = CSSElement("#su")


dr = webdriver.Chrome()
dr.get("http://www.baidu.com")
page = baiduPage(dr)
page.set_text(page.search_input, "poium")
page.click(page.search_button)

dr.close()

如果你看不懂上面的封装代码的话,可以重点看下面的调用代码,针对元素的点击和输入。

page.set_text()
page.click()

表示操作的方法,在Page类中实现。

page.search_input
page.search_button

表示操作的对象,在Page的继承类baiduPage中定义。

page.set_text(page.search_input, "poium")
page.click(page.search_button)

操作的动作 和 操作的对象 都是以 page. 调用,万一我要操作的对象也命名为 click 那不就和操作的动作 傻傻分不清楚了, 所以,这样的语法不是很怪么?

所以,这个问题一直困扰我挺久的,我一直没想到更好的设计。

新的设计思路

直到前几天又重新学习了Python的 __get__ 和 __set__ 内置方法,才把这个问题解决。

# =====封装代码======class Page(object):

   def __init__(self, driver):
       self.driver = driverclass CSSElement(object):

   driver = None

   def __init__(self, css):
       self.css = css    def __get__(self, instance, owner):
       if instance is None:            return None
       global driver
       driver = instance.driver        return self    def set_text(self, value):
       global driver
       driver.execute_script("""var elm = document.querySelector("{css}");
                   elm.style.border="2px solid red";
                   elm.value = "{value}";""".format(css=self.css, value=value))    def click(self):
       global driver
       driver.execute_script("""var elm = document.querySelector("{css}");
                  elm.style.border="2px solid red";
                  elm.click();""".format(css=self.css))# =======调用代码==============from selenium import webdriverclass baiduPage(Page):
   search_input = CSSElement("#kw")
   search_button = CSSElement("#su")


dr = webdriver.Chrome()
dr.get("http://www.baidu.com")
page = baiduPage(dr)
page.search_input.set_text("poium")
page.search_button.click()

dr.close()

如果看不懂封装代码的话,直接看调用代码。

page.search_input.set_text("poium")
page.search_button.click()

page 表示页面; search_input 表示页面上的某个对象; set_text() 表示对象的动作。

这样的语法是不是要比前面好了很多?而保持了与Selenium API 封装的语法一致性。

项目地址:https://github.com/defnngj/poium

做开源项目的生活就是这么朴实无华,且有趣!



少客联盟- 版权声明 1、本主题所有言论和图片纯属会员个人意见,与少客联盟立场无关。
2、本站所有主题由该帖子作者发表,该帖子作者铭镕小姐姐少客联盟享有帖子相关版权。
3、少客联盟管理员和版主有权不事先通知发贴者而删除本文。
4、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者铭镕小姐姐少客联盟的同意。
5、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任。
6、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
7、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意。
8、官方反馈邮箱:chinasuc@chinasuc.cn


上一篇:巧用python实现简单爬虫功能
下一篇:python爬虫爬取淘宝天猫商品评论数据教程
最新回复 (0)
全部楼主
    • 少客联盟
      2
        登录 注册 QQ登录(停用)
返回
负责声明:本站部分资源来源于网络,如有侵权请发邮件(chinasuc@chinasuc.cn)告知我们,我们将会在24小时内处理。