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的記錄。
Selenium2Library源碼中browser的傳遞