我正在使用java swing创建一个应用程序来验证对象存储库,这将有助于维护selenium脚本。这个应用程序将启动一个WebDriver实例,然后让用户手动导航到他/她希望检查的元素。
我想要获取用户单击的WebElement对象的实例,这样我就可以将最后单击的web元素作为参数传递到下面的函数中,该函数返回一个Xpath。
我在web上找不到任何与此相关的东西。
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);
}发布于 2018-02-06 01:51:59
发布于 2018-02-06 02:20:11
对于这个问题,webdriver还没有一个解决方案。您需要弄清楚的是如何根据您单击的内容生成一个定位器,比如xpath或css选择器。这很可能需要在页面上以某种注入的javascript的形式来监听点击。在谷歌上快速搜索,会得到这个答案How to get the xpath by clicking an html element
一旦你有了这个定位器,你的下一个任务就是把它带到你的webdriver代码的作用域中,这样你就可以在测试中使用它的值了。
就在我的头上,你可以这样做的一种方法是使用相同的javascript注入在页面的角落创建一个隐藏元素,它的value属性在每次单击时更新到您决定生成定位器的任何输出。这将允许您的java代码获取该秘密元素,并向其请求先前单击的元素的xpath。
但需要注意的是,如果您要在页面上注入任何内容,请确保您的注入不会更改页面上元素的上下文。如果您注入了对实际页面元素有功能影响的任何内容,那么当您将页面恢复到其自然状态时(通过页面刷新或其他方式),您的xpath可能会停止工作。
一般来说,注入页面不利于测试,因为它会使页面的已知状态失效。但是,听起来您似乎正在尝试实现一个xpath辅助工具,用于帮助在另一个上下文中编写webdriver代码,只要正确生成了xpath,并且注入不会改变其绝对位置,就可以使用该工具。
还有一件事需要考虑,您是否希望生成简洁且构建良好的定位器?您找到的任何生成的定位器都可能是爬行dom并构建冗长的绝对路径的结果,这将更容易被活跃开发的站点破坏。
https://stackoverflow.com/questions/48627497
复制相似问题