首页 > 解决方案 > 我如何在空手道 UI 中使用 javascript 执行器

问题描述

首先,空手道 UI 自动化是非常棒的工具。在使用空手道编写 UI 测试时,我有点享受它。我遇到了一种情况,我试图获取 shadowRoot 元素。我阅读了一些与 javascript executor with karate 相关的类似帖子,并了解到它已经得到了回答。建议使用 driver.eval。但在空手道 0.9.5 中没有 eval,它有 script() 或 scriptAll()。我已经阅读了几次文档来弄清楚如何在元素中获取元素,但没有运气。使用传统的 selenium+java,我们可以像这样获取 shadowRoot:像 shadowRoot 这样的东西,它位于像 div 或 body 这样的父元素内。

//downloads-manager is the tagname and under that downloads-manager, a shadowRoot element exists
The HTML looks like this. it is from chrome://downloads.
<downloads-manager>
   #shadow-root(open)

</download-manager>
WebElement downloadManager =driver.findElement(By.tagName("downloads-manager");
WebElement shadowRoot= (WebElement)((JavaScriptExecutor)driver)
                                      .executeScript("return arguments[0].shadowRoot",downloadManager);

所以我在空手道 UI 中尝试了以下操作

  script("downloads-manager","return _.shadowRoot"); //js injection error

  script('downloads-manager', "function(e){ return e.shadowRoot;}"); // same injection error as mentioned above.

def shadowRoot = locate("downloads-manager").script("function(e){return e.shadowRoot};"); //returns an empty string.

我敢打赌,有一种方法可以使用 Karate UI 获取此 shadowRoot 元素,但我有点用完了选项,无法弄清楚这一点。有人可以调查一下并帮助我吗?

-桑

标签: karate

解决方案


你可以切换到 XPath 看看是否有帮助:

* def temp = script('//downloads-manager', '_.innerHTML')

否则请以这种格式提交样本,以便我们进行调试:https ://github.com/intuit/karate/tree/develop/examples/ui-test

编辑:在您在评论中发布该视频群聊示例的链接后,我想出了可行的 JS:

* driver 'http://html5-demos.appspot.com/hangouts'
* waitFor('#hangouts')
* def heading = script('hangout-module', "_.shadowRoot.querySelector('h1').textContent")
* match heading == 'Paul Irish'

需要反复试验和摆弄 DevTools 控制台才能解决这个问题。所以好消息是它是可能的,你可以使用任何你需要的 JS,而且你确实需要知道调用哪个HTML 元素.shadowRoot

编辑:对于空手道中 JS 的其他示例:https ://stackoverflow.com/a/60800181/143475


推荐阅读