2016-07-23 79 views
2

我有一個html表,我想根據文本以及它是否不包含某個類,在tbody中找到td元素。即使文本存在,它也應忽略thead中的任何內容。如何使用Selenium查找基於文本和類的元素?

... 

<div id="mytable"> 
    <div> 
     <table> 
      <thead> 
       <tr>....</tr> 
       ... 
      </thead> 
      <tbody> 
       <tr> 
        <td class="inactive">3</td> 
        <td>4</td> 
       </tr> 
      </tbody> 
     </table> 
    </div> 
</div> 

... 

下面是代碼:

def do_click(user_input): 
    browser = webdriver.Firefox() 
    browser.get(url) 

    mytable_div = browser.find_element_by_id("mytable") 
    element = mytable_div.find_element_by_xpath("//div/table/tbody/td[contains(text()='%s')]" % user_input) 

    if element: 
     element.click() 

因此,如果user_input = 3,表格元素不應被點擊,因爲它具有類inactive即使文本是存在的。

如果user_input = 4,則表單元素應該被點擊,因爲它沒有不活動的類和文本存在。

當前代碼不起作用,因爲我的xpath表達式是無效的,但我不知道檢查類和文本的正確方法是什麼。

回答

0

您正處在正確的軌道上。 contains()是一個函數,並期望傳入2個參數 - 一個字符串在哪裏看,一個子字符串 - 看什麼。解決你的表達:

"//div/table/tbody//td[contains(text(), '%s')]" % user_input 

您也可以在這種情況下,使用一個點而不是text()

而且,還需要檢查類是不inactive,加上「不包含」檢查:

"//div/table/tbody//td[contains(., '%s')][not(contains(@class, 'inactive'))]" % user_input 

至於邏輯,處理NoSuchElementException例外,如果上調,將意味着該元素是不如果沒有發生異常,請單擊該元素:

from selenium.common.exceptions import NoSuchElementException 

try: 
    element = mytable_div.find_element_by_xpath("//div/table/tbody//td[contains(., '%s')][not(contains(@class, 'inactive'))]" % user_input) 
    element.click() 
except NoSuchElementException: 
    print("Element not found") 
+0

如果'td'元素具有'inactive'類,我該如何防止點擊? – warchest

+0

@warwarst啊,當然,更新。 – alecxe

+0

謝謝,但由於某種原因xpath返回一個錯誤:'消息:沒有這樣的元素:無法找到元素:{「方法」:「xpath」,「選擇器」:「//div/table/tbody/td [包含(。,'4')] [not(contains(@class,'inactive'))]「}'。 **然而**,我可以直接用'// div/table/tbody/tr [1]/td [2]'找到並點擊它。看起來這個元素肯定存在,但是xpath並沒有採用它。 – warchest

相關問題