Selenium2Library源码中browser的传递

C:\Python27\Lib\site-packages\Selenium2Library\keywords\_element.py

在def _element_find(self, locator, first_only, required, tag=None)中第一条语句为
        browser = self._current_browser()

通过eclipse的pydev插件跟进代码发现此处调用的是_BrowserManagementKeywords类中的_current_browsers()方法,但是研究了很久_ElementKeywords与_BrowserManagementKeywords之间并无继承关系,这个方法怎么能调用成功呢?

后来研究发现在Selenium2Library包的__init__.py文件中Selenium2Library这个class继承了keywords包下所有的类,这也是为什么在使用Selenium2Library时只需要引用这一个包就可以使用所有关键字的原因了。从此处去分析,因为self代表的是实例本身而不是类本身。我们在实际使用过程中生成的Selenium2Library的实例,而这个实例的self是能够调用所有关键字中的方法的,也就是说此处是Selenium2Library().current_browser(),调用成功。

  为了验证这个思路我创建了一个自己的Python library继承自_ElementKeywords

from Selenium2Library.keywords import _ElementKeywords
class myselenium(_ElementKeywords):
    def __init__(self):
        return "Test"
#Robot
*** Settings ***
Library    Selenium2Library
Library    mySelenium.myselenium

*** Test Cases ***
test1
    Open Browser    http://www.baidu.com    ie
    mySelenium.myselenium.Get WebElement    id=su

这个时候运行发现报错信息为

20171018 23:40:41.680 : INFO : Opening browser 'ie' to base url 'http://www.baidu.com'
20171018 23:41:01.308 : FAIL : AttributeError: 'myselenium' object has no attribute '_current_browser'

这说明在_ElementKeywords 的实例是不能够直接调用_current_brwser方法的。

2.进一步验证Python语法是否支持我以上的猜想

 

class tester:
    def design(self):
        print  "this is design"

class leader:
    def review(self):
        self.design()
        print "This is review"

class testleader(tester,leader):
    def __init__(self):
        self.review()

if __name__ == "__main__":
    l=testleader()

 

运行以上代码,运行结果为输出

this is design

this is review

也就是说Python语法支持以上猜想

有了这两个论证,基本上能够确认这个猜想是正确的。而且Selenium2Library代码中除了browser的获取log的输出要采用了同样的方法,调用了_LoggingKeywords中的方法进行log的记录。

posted @ 2017-10-18 23:59  zhanghaihui  阅读(803)  评论(0编辑  收藏  举报