2015-08-24 72 views
0

我試圖創建一個定義,允許我單擊一個對象而不管元素類型。爲了達到這個目的,我創建了一個包含我想運行的命令的變量。執行存儲在變量(Python> Webdriver)中的Selenium命令

def clickOnStaleElement(driver, objStrategy, element): 
    lhs, rhs = objStrategy.split(".", 1) 
    myCommand = "driver.find_element_by_"+rhs.lower()+"(\""+element+"\").click()" 

我似乎無法弄清楚如何執行這個存儲在變量中的命令。我嘗試'driver.execute_script()'但收到WebDriverException。嘗試'exec()',&'eval()'導致文本掛起。我如何實現這一目標?有沒有更好的方式去實現這種行爲?我意識到我如何努力實現這種行爲可能並不理想,所以我打開更好的方式來完成相同的任務。如果可能的話,我不想爲每種元素類型創建'if/then'語句。

+0

你不想做這樣的事情。它的不良習慣形成,並使代碼本身很難看/理解。再加上'exec'或'eval'幾乎是一個詛咒詞在這裏大聲笑。 – TehTris

+0

夠公平的,@TehTris。這就是爲什麼我問第二個問題關於實現這一目標的更好方法。除了爲每種可能的元素類型創建if/then語句之外,我還希望做一些其他的操作。感謝您的回覆! – rwbyrd

回答

2

您可以創建從一個字符串的函數提供了一個映射字典,然後做一個簡單的查找:

strategy = { 
    "id": driver.find_element_by_id, 
    "name": driver.find_element_by_name, 
    ... 
} 
find_element = strategy.get(rhs.lower()) 
find_element(element).click() 

你可能想有一個默認的方法,或以其他方式在那裏的情況下rhs.lower()準備與字典中的任何內容不匹配。

+1

這很光滑。這個答案值得被挑選。 – TehTris

+0

謝謝@Bryan Oakley。這絕對比我所看到的要好。 – rwbyrd

0
def clickOnStaleElement(driver, objStrategy, element): 
    lhs, rhs = objStrategy.split(".",1) #ASSUMING only valid stuff comes down like "???.xpath" , "???.name" "???.id" bla bla ... we'll just keep this here for now.... 
    if rhs == 'xpath': 
     myCommand = driver.find_eleemnt_by_xpath(element) # xpath example, you better hope you entered valid xpath as "element" 
    elif rhs == 'id': 
     myCommand = driver.find_eleemnt_by_id(element) 
    elif rhs == 'name': 
     #you get the idea 
. 
. 
. 
    else: 
     print("rhs, not recognized/valid/watever") 
    myCommand.click() 

我會從字面上把它分解成每個都有自己的if語句,在watever rhs是。

另外在我看來,沒有理由將「???。somethng」這樣的文件傳入objStrategy,爲什麼不傳遞你真正想要的內容呢?

+0

好的,如果將它們分開是我最好的選擇,我不應該只是刪除拆分命令,而是這樣做呢? '如果objStrategy == 「By.LINK_TEXT」:'' driver.find_element_by_link_text(元件)。單擊()'' elif的objStrategy == 「By.XPATH」:'' driver.find_element_by_link_text(元件)。單擊()' 'else:' 'raise NoSuchElementException(「ERROR」)' – rwbyrd