1. 程式人生 > >Selenium2Library源碼中browser的傳遞

Selenium2Library源碼中browser的傳遞

繼承 review ren init 說明 python div error 過程

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的傳遞