web-dev-qa-db-de.com

Verwendung von Regex in Selen Locators

Ich verwende Selenium RC und möchte zum Beispiel alle Verknüpfungselemente mit dem Attribut href erhalten, die übereinstimmen:

http://[^/]*\d+com

Ich würde gerne benutzen:

sel.get_attribute( '//a[regx:match(@href, "http://[^/]*\d+.com")]/@name' )

dies würde eine Liste des Namensattributs aller Links zurückgeben, die dem regulären Ausdruck entsprechen. (oder so ähnlich)

vielen Dank

11
Guy

Eine mögliche Lösung besteht darin, sel.get_eval() zu verwenden und ein JS-Skript zu schreiben, das eine Liste der Links zurückgibt. so etwas wie die folgende Antwort: Selen: Ist es möglich, die Regexp in Selen Locators zu verwenden

1
Guy

Die obige Antwort ist wahrscheinlich der richtige Weg, um ALLE Links zu finden, die zu einem regulären Ausdruck passen, aber ich dachte, es wäre auch hilfreich, den anderen Teil der Frage zu beantworten, wie man regulären Ausdruck in Xpath-Locators verwendet. Sie müssen die Regex-Funktion matches () wie folgt verwenden:

xpath=//div[matches(@id,'che.*boxes')]

(dies würde natürlich das div mit 'id = checkboxes' oder 'id = cheANYTHINGHEREboxes' anklicken)

Beachten Sie jedoch, dass die Übereinstimmungsfunktion nicht von allen nativen Browserimplementierungen von Xpath unterstützt wird (am auffälligsten ist, dass die Verwendung dieser Funktion in FF3 einen Fehler auslöst: ungültiger xpath [2]).

Wenn Sie Probleme mit Ihrem speziellen Browser haben (wie ich es mit FF3 getan habe), verwenden Sie Seleniums allowNativeXpath ("false"), um zum JavaScript Xpath-Interpreter zu wechseln. Es wird langsamer sein, aber es scheint mit mehr Xpath-Funktionen zu funktionieren, einschließlich 'Matches' und 'Ends-with'. :)

11
Chris Jaynes

Sie können den Selenium-Befehl getAllLinks verwenden, um ein Array der IDs der Links auf der Seite abzurufen, die Sie dann durchlaufen und die href mit dem getAttribute überprüfen können, das den Locator gefolgt von einem @ und dem Attributnamen verwendet. In Java könnte dies beispielsweise sein:

String[] allLinks = session().getAllLinks();
List<String> matchingLinks = new ArrayList<String>();

for (String linkId : allLinks) {
    String linkHref = Selenium.getAttribute("id=" + linkId + "@href");
    if (linkHref.matches("http://[^/]*\\d+.com")) {
        matchingLinks.add(link);
    }
}
3
Dave Hunt

Hier sind einige alternative Methoden für Selenium RC. Dies sind keine reinen Selenium-Lösungen, sondern ermöglichen die Interaktion mit Ihren Programmiersprachendatenstrukturen und Selen.

Sie können auch eine HTML-Seitenquelle abrufen und dann einen regulären Ausdruck als Quelle verwenden, um eine Übereinstimmungsmenge von Links zurückzugeben. Verwenden Sie die Regex-Gruppierung, um URLs, Verknüpfungstexte/IDs usw. zu trennen. Anschließend können Sie sie an Selenium zurückgeben, um darauf zu klicken oder zu navigieren.

Eine andere Methode ist, HTML-Seitenquelle oder innerHTML (über DOM-Locators) eines übergeordneten/Stammelements abzurufen und dann das HTML in XML als DOM-Objekt in Ihrer Programmiersprache zu konvertieren. Anschließend können Sie das DOM mit dem gewünschten XPath durchlaufen (mit oder ohne regulären Ausdruck) und einen Knotensatz nur der Links von Interesse abrufen. Wenn Sie den Linktext/die ID oder die URL auslesen, können Sie zu Selenium zurückkehren, um darauf zu klicken oder zu navigieren.

Auf Anfrage stelle ich nachfolgend Beispiele zur Verfügung. Es sind gemischte Sprachen, da der Beitrag sowieso nicht sprachspezifisch zu sein schien. Ich verwende nur das, was ich zur Verfügung hatte, um Beispiele zu finden. Sie sind nicht vollständig getestet oder überhaupt nicht getestet, aber ich habe bereits in anderen Projekten mit Codebausteinen gearbeitet. Dies sind also Beispiele für Beweise für Konzeptcodes, die zeigen, wie Sie die gerade erwähnten Lösungen implementieren würden.

//Example of element attribute processing by page source and regex (in PHP)
$pgSrc = $sel->getPageSource();
//simple hyperlink extraction via regex below, replace with better regex pattern as desired
preg_match_all("/<a.+href=\"(.+)\"/",$pgSrc,$matches,PREG_PATTERN_ORDER);
//$matches is a 2D array, $matches[0] is array of whole string matched, $matches[1] is array of what's in parenthesis
//you either get an array of all matched link URL values in parenthesis capture group or an empty array
$links = count($matches) >= 2 ? $matches[1] : array();
//now do as you wish, iterating over all link URLs
//NOTE: these are URLs only, not actual hyperlink elements

//Example of XML DOM parsing with Selenium RC (in Java)
String locator = "id=someElement";
String htmlSrcSubset = sel.getEval("this.browserbot.findElement(\""+locator+"\").innerHTML");
//using JSoup XML parser library for Java, see jsoup.org
Document doc = Jsoup.parse(htmlSrcSubset);
/* once you have this document object, can then manipulate & traverse
it as an XML/HTML node tree. I'm not going to go into details on this
as you'd need to know XML DOM traversal and XPath (not just for finding locators).
But this tutorial URL will give you some ideas:

http://jsoup.org/cookbook/extracting-data/dom-navigation

the example there seems to indicate first getting the element/node defined
by content tag within the "document" or source, then from there get all
hyperlink elements/nodes and then traverse that as a list/array, doing
whatever you want with an object oriented approach for each element in
the array. Each element is an XML node with properties. If you study it,
you'd find this approach gives you the power/access that WebDriver/Selenium 2
now gives you with WebElements but the example here is what you can do in
Selenium RC to get similar WebElement kind of capability
*/
0
David