如何使用硒定位器正则表达式(How to use regex in selenium locator

2019-07-17 11:16发布

我使用硒RC,我想,例如,要获得所有属性HREF是匹配的链接元素:

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

我想用:

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

这将返回所有匹配的正则表达式,该链接的name属性的列表。 (或类似的东西)

谢谢

Answer 1:

以上答案很可能是要找到所有匹配的正则表达式,该链接的正确的方式,但我认为这也将会是有助于回答这个问题,如何在XPath定位使用正则表达式的其他部分。 您需要使用正则表达式匹配()函数,就像这样:

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

(这一点,当然,可以点击与“ID =复选框”,或“ID = cheANYTHINGHEREboxes”股利)

要知道,虽然,比赛功能不与XPath的所有原生浏览器实现的支持(最明显,在FF3使用,这将引发错误:无效的XPath [2])。

如果您有您的特定浏览器的麻烦(因为我用FF3一样),请尝试使用Selenium的allowNativeXpath(“假”)切换到JavaScript的XPath解释。 它会比较慢,但是它似乎有更多的XPath功能,包括“比赛”和“结束,以”工作。 :)



Answer 2:

您可以使用硒命令getAllLinks获得链接的ID数组在页面上,然后你可以遍历,并检查使用getAttribute,这需要定位器后跟@和属性名称在href。 例如,在Java中,这可能是:

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);
    }
}


Answer 3:

一个可能的解决方案是使用sel.get_eval()写一个JS脚本,它返回链接的列表。 类似如下的回答: 硒:是否可以使用硒定位器正则表达式



Answer 4:

下面是一些替代的方法,以及对硒RC。 这些都不是纯硒的解决方案,它们允许你的编程语言,数据结构和硒的相互作用。

您也可以得到HTML页面源,那么正则表达式源返回一个比赛组链接。 使用表达式分组分离出的URL,链接文本/ ID等,那么你可以将它们传递回硒点击或浏览到。

另一种方法是让父/根元素的HTML页面源代码或innerHTML的(通过DOM定位器),然后将HTML转换成XML作为编程语言DOM对象。 然后,您可以遍历与所需的XPath(用正则表达式与否)的DOM,并获得利息只有链接的一个节点集。 从他们解析出链接文本/ ID或URL,你可以回传给硒点击或浏览到。

根据要求,我提供了以下示例。 它的混合语言,因为后似乎没有具体的语言反正。 我只是用了我必须提供为实例一起下锅。 他们不完全测试或所有测试,但我已经在其他项目之前的代码位的工作,所以这些都是你要如何实现我刚才提到的解决方案的概念代码示例证明。

//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
*/


文章来源: How to use regex in selenium locators