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的记录。