如何在手动单击活动WebDriver会话中的对象时获取WebElement对象

时间:2018-02-05 16:49:33

标签: javascript selenium xpath selenium-webdriver webdriver

我正在使用java swing创建一个应用程序来验证Object存储库,这有助于维护selenium脚本。此应用程序将启动WebDriver实例,然后让用户手动导航到他/她希望检查的元素。

我想获取用户单击的WebElement对象的实例,以便我可以将最后单击的Web元素作为下面函数中的参数传递,该函数返回X路径。

我无法在网络上找到与此相关的任何内容。

public String getElementXPath(WebDriver driver, WebElement element) {
    return (String)((JavascriptExecutor)driver).executeScript("gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b<e.length;b++){var d=e[b];if(d===c){return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}if(d.nodeType===1&&d.tagName===c.tagName){a++}}};return gPt(arguments[0]).toLowerCase();", element);
}

2 个答案:

答案 0 :(得分:0)

单击元素无法获取实例。您应该自己创建唯一的xpath,然后就可以了。

要获取webelement的实例,您可以使用下一个:

WebElement el = (WebElement)((JavascriptExecutor)driver)
                              .executeScript("document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;");

在这种情况下,您应该自己构建xpath,然后使用它来查找元素。请参阅herehere

答案 1 :(得分:0)

此问题没有由webdriver打包的解决方案。你需要弄清楚的是如何根据你点击的内容生成一个定位器,如xpath或css选择器。这很可能需要在页面上注入一些用于监听点击的javascript。快速谷歌搜索得出了这个答案How to get the xpath by clicking an html element

一旦你拥有了这个定位器,你的下一个任务就是将它带入你的webdriver代码的范围,这样你就可以在测试中使用它的价值。

就在我的脑海中,你可以这样做的一种方法就是使用相同的javascript注入在页面上创建一个隐藏元素,在角落里更新它的value属性每次点击到您决定的任何输出将生成您的定位器。这将允许您的java代码获取该秘密元素并向其请求前面单击的元素的xpath。

但有一点需要注意,如果您要在页面上注入任何内容,请确保您的注入不会更改页面上元素的上下文。如果你注入任何对真实页面元素有功能影响的东西,你可以把自己置于一个地方,当你将页面恢复到自然状态时(通过页面刷新或其他任何方式),你的xpath就会停止工作。

一般来说,对页面的注入不利于测试,因为它会使页面的已知状态无效。但是,听起来你正在尝试完成一个xpath辅助工具,以帮助在另一个上下文中编写webdriver代码,只要你的xpath正确生成,并且注入不会改变它们的绝对位置,这可能没问题。

还有一件事需要考虑,您是否希望生成简洁且构建良好的定位器?您找到的任何生成的定位器都可能是爬行dom并构建冗长的绝对路径的结果,这将由一个积极开发的站点更容易打破。