2016-04-27 4 views
4

Ich war neugierig, ob es eine Möglichkeit gab, ein Element zu finden, das Selenium und Python 2.7 durch mehrere "Schlüsselwörter" in beliebiger Reihenfolge verwendet. Lassen Sie mich mit einem Beispiel erklären:Wie finde ich ein Element durch mehrere Textstrings?

keyword1 = raw_input("Keyword: ").lower().title() 
keyword2 = raw_input("Keyword: ").lower().title() 

    try : 
     clickOnProduct = "driver.find_element_by_xpath(\"//*[contains(text(), '" + keyword1 + "')]\").click()" 
     exec(clickOnProduct) 

Dies ist nur ein Ausschnitt des Codes, aber wie kann ich das übernehme für ein Element zu suchen, die beide dieser Schlüsselwort enthalten (keyword1, keyword2) in jedem Auftrag? Es klingt im Prinzip einfach, und es ist wahrscheinlich, aber ich habe eine verdammt lange Zeit, um das zu bekommen. Irgendwelche Vorschläge würden sehr geschätzt werden, danke.

Antwort

6

Sie können den XPath-Ausdruck mit or und dynamisch konstruieren:

keywords = [keyword1, keyword2, ... ] 
conditions = " or ".join(["contains(., '%s')" % keyword for keyword in keywords]) 
expression = "//*[%s]" % conditions 

elm = driver.find_element_by_xpath(expression) 

Wenn zum Beispiel keyword1hello und keyword2 würde world sein würde, würde die expression werden:

//*[contains(., 'hello') or contains(., 'world')] 

Wenn Sie auch mit Groß- und Kleinbuchstaben umgehen möchten, müssen Sie translate() verwenden. Weitere Informationen finden Sie in diesem Abschnitt elevant thread:

+0

Ich scheine immer noch Probleme haben zu werden. Der Ausdruck sieht so aus: '// * [enthält (., 'Coat') oder enthält (., 'Car')]' aber es kann immer noch kein Element mit dem Text "Car Coat" gefunden werden. –

+0

Verstanden! Vielen Dank, war ein einfacher Fehler meinerseits. Ich habe mein Problem behoben, indem ich '.join ([" enthält (., '% S') "' zu '.join ([" enthält (text(), '% s') "'. Danke für die Hilfe! –

Verwandte Themen