【问题标题】:How to fetch the WebElement object upon manually clicking an object within an active WebDriver Session如何在活动 WebDriver 会话中手动单击对象时获取 WebElement 对象
【发布时间】:2018-07-15 14:24:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript selenium xpath selenium-webdriver webdriver


    【解决方案1】:

    您不能仅通过单击元素来获取实例。你应该自己制作唯一的xpath,然后你就可以了。

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

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

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

    【讨论】:

    • @julian 或其他任何人,您能否帮助我了解如何将 JS 注入浏览器,该浏览器将创建一个隐藏元素,该元素附加的属性会在每次有鼠标单击事件时刷新?感谢你的帮助。提前致谢!
    【解决方案2】:

    webdriver 没有针对此问题提供的解决方案。您需要弄清楚的是如何根据您单击的内容生成定位器,例如 xpath 或 css 选择器。这很可能需要在页面上以一些注入的 javascript 的形式来监听点击。快速谷歌搜索产生了这个答案How to get the xpath by clicking an html element

    一旦您有了该定位器,您的下一个任务就是将其纳入您的 webdriver 代码范围,以便您可以在测试中使用它的价值。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 2012-07-17
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多