2016-07-23 9 views
2

Ich habe eine HTML-Tabelle, und ich möchte das td Element in tbody basierend auf dem Text finden und wenn es keine bestimmte Klasse enthält. Es sollte alles in thead ignorieren, auch wenn der Text vorhanden ist. HierWie findet man Elemente basierend auf Text und Klasse mit Selen?

... 

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

... 

ist der Code:

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() 

Also, wenn die user_input = 3, das Tabellenelement soll nicht angeklickt werden, da er die Klasse hat inactive obwohl der Text vorhanden ist.

Wenn die user_input = 4, dann sollte das Tabellenelement geklickt werden, da es keine inaktive Klasse hat und der Text vorhanden ist.

Momentan funktioniert der Code nicht, weil mein XPath-Ausdruck ungültig ist, aber ich bin mir nicht sicher, wie der korrekte Weg für die Klasse und den Text aussehen würde.

Antwort

0

Sie sind auf dem richtigen Weg. contains() ist eine Funktion und erwartet, dass 2 Argumente übergeben werden - eine Zeichenfolge, wo gesucht werden soll und eine Teilzeichenfolge - was zu sehen ist. Fix Ihren Ausdruck:

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

Sie auch einen Punkt statt text() in diesem Fall verwenden kann.

Und auch für die Klasse zu überprüfen nicht inactive sein, fügen Sie „enthält nicht“ check:

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

Was die Logik, behandeln die NoSuchElementException Ausnahme die, wenn sie angehoben wird, um das Element bedeuten würde, war nicht gefunden, klicken Sie auf das Element, wenn keine Ausnahme ausgelöst wurde:

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

Wie verhindere ich das Klicken, wenn das 'td' Element die Klasse 'inaktiv' hat? – warchest

+0

@warchest ah, natürlich, aktualisiert. – alecxe

+0

Danke, aber aus irgendeinem Grund gibt der xpath einen Fehler zurück: 'Nachricht: kein solches Element: Element kann nicht gefunden werden: {" method ":" xpath "," selector ":" // div/table/tbody/td [enthält (., '4')] [not (contains (@class, 'inactive'))] "}'. ** Wie auch immer **, ich finde und klicke direkt mit '// div/table/tbody/tr [1]/td [2]'. Es scheint, dass das Element definitiv da ist, aber der XPath nimmt es nicht auf. – warchest

Verwandte Themen