2012-08-14 13 views
14

Ich versuche, ein Element mit einer dynamisch generierten ID zu finden. Der letzte Teil der Zeichenkette ist konstant ("ReportViewer_fixedTable"), damit kann ich das Element lokalisieren. Ich habe versucht, Regex zu verwenden, in XPath:Finden eines Elements durch partielle ID mit Selen in C#

targetElement = driver.FindElement(
    By.XPath("//table[regx:match(@id, "ReportViewer_fixedTable")]")); 

und Ortung von CSSSelector:

targetElement = driver.FindElement(
    By.CssSelector("table[id$='ReportViewer_fixedTable']")); 

weder Werke. Irgendwelche Vorschläge würden geschätzt werden.

Antwort

34

Das liegt daran, dass der CSS-Selektor geändert werden muss man fast da ... waren

driver.FindElement(By.CssSelector("table[id*='ReportViewer_fixedTable']"))` 

Von http://sauceio.com/index.php/2010/01/selenium-totw-css-selectors-in-selenium-demystified/:

css=a[id^='id_prefix_'] 

Eine Verbindung mit einem id die id_prefix_ mit dem Text beginnt.

css=a[id$='_id_sufix'] 

eine Verbindung mit einem id_id_sufix der mit dem Text endet.

css=a[id*='id_pattern'] 

eine Verbindung mit einem id, die den Text enthält id_pattern.

Sie haben ein Suffix verwendet, von dem ich annehme, dass es nicht die partielle Link-Textidentifikation war, die Sie verwenden sollten (es sei denn, ich sah Ihren HTML-Code, was bedeutet, dass Sie beim nächsten Mal Ihren HTML-Code anzeigen). *= ist jedoch in jeder Situation zuverlässig.

+0

Wie kann ich dies anwenden, um eine teilweise Übereinstimmung für CSS-Klassennamen zu tun? Ich suche nach Label-Elementen, die entweder die Klasse 'custom-label' oder 'countable-custom-label' haben. 'By.CssSelector (" Label [Klasse $ = Custom-Label ")' scheint nicht zu funktionieren. Ich kann einfach zweimal By.ClassName verwenden und die Ergebnisse kombinieren, würde aber gerne wissen, wie dies mit CssSelector erreicht werden kann. – atlantis

2

versuchen

targetElement = driver.FindElement(By.XPath("//table[contains(@id, "ReportViewer_fixedTable")]")); 

Beachten Sie, wird dies für alle Elemente überprüfen, die ID haben, die enthält (und nicht nur endet mit ‚ReportViewer_fixedTable‘). Ich werde versuchen, eine Regex-Option zu finden, die eine genauere Antwort auf Ihre Frage wäre.

+0

und ja ein schmutziger Weg wäre .//table[substring(@id, string-length (@id) - 22) = 'ReportViewer_fixedTable'] –

+0

Danke, das hat den Trick gemacht. –

0

Diese Lösung funktioniert unabhängig von der XPath-Version. Erstellen Sie zunächst eine Methode irgendwo in Ihrer COMMON-Hilfsklasse.

public static string GetXpathStringForIdEndsWith(string endStringOfControlId) 
    { 
     return "//*[substring(@id, string-length(@id)- string-length(\"" + endStringOfControlId + "\") + 1)=\"" + endStringOfControlId + "\"]"; 
    } 

In meinem Fall unten ist die ID Kontrolle in anderer Version meines Produktes ::

v1.0 :: ContentPlaceHolderDefault_MasterPlaceholder_HomeLoggedOut_7_hylHomeLoginCreateUser

v2.0 :: ContentPlaceHolderDefault_MasterPlaceholder_HomeLoggedOut_8_hylHomeLoginCreateUser

Dann Sie können die obige Methode aufrufen, um das Steuerelement zu finden, das über eine statische Endzeichenfolge verfügt.

By.XPath(Common.GetXpathStringForIdEndsWith("<End String of the Control Id>")) 

Für die Steuer-IDs, die ich für v1 erwähnt & v2, verwende ich wie unten:

By.XPath(Common.GetXpathStringForIdEndsWith("hylHomeLoginCreateUser")) 

Die gesamte Logik ist, dass Sie die folgenden XPath-Ausdruck verwenden, um eine Kontrolle zu finden, die Enden mit bestimmten Zeichenfolge:

//*[substring(@id, string-length(@id)- string-length("<EndString>") + 1)="<EndString>"] 
Verwandte Themen