javascript错误:ShadowRoot上不允许使用Robot Framework进行鼠标悬停的方法“elementsFromPoint”
Posted
技术标签:
【中文标题】javascript错误:ShadowRoot上不允许使用Robot Framework进行鼠标悬停的方法“elementsFromPoint”【英文标题】:javascript error: Disallowed method "elementsFromPoint" on ShadowRoot on doing mouse hover using Robot Framework 【发布时间】:2021-08-01 15:29:22 【问题描述】:我正在尝试使用 Robot Framework 的关键字 Mouse Over 将鼠标悬停在某个元素上,但出现“javascript 错误:ShadowRoot 上不允许的方法“elementsFromPoint”。” . Click Element 等其他关键字适用于同一元素。但是当我尝试鼠标悬停时,它会抛出上述错误。我不确定如何解决此错误。 谁能帮我解决这个问题。
【问题讨论】:
欢迎来到 SO!请查看tour 和minimal reproducible example shadowRoot 本身不是 DOM 元素。它是元素的容器。在实际的 DOM 元素上执行elementsFromPoint
@Danny '365CSI' Engelman 我的应用程序是salesforce,问题是整个DOM 中没有shadow-root DOM。但错误说ShadowRoot。你知道javascript什么时候抛出这样的错误吗?
不,我不知道 Salesforce(LWC 组件)我认为 *** 有一个特定的标签;否则,请尝试 Twitter 并询问 Salesforce Web 组件专家在哪里。
【参考方案1】:
由于 SalesForce 及其工具提示的一些最新更新,这也刚刚出现在我身上。我建议将操作包装在 Try/Catch 中,然后尝试下面的替代方法。
我所做的是获取元素的父元素 - 这可能是一些描述性文本 - 单击父元素以使其获得焦点,然后使用 sendkeys TAB 激活工具提示。
由于这包含在 Try / Catch 中,如果 SalesForce 选择回滚此更改,则无需进一步维护。
顺便说一下,我尝试了一堆 JavaScript 解决方案 arguments[0].focus() 参数[0].fireEvent('onmouseover') 而且我无法工作。
此外,您可能会发现,在 Linux 上的无头 Chrome 浏览器上运行测试会使操作鼠标和单击操作无用。
> Blockquote
try
actions.moveToElement(element, 5, 5).perform();
catch (Exception e)
//Alternate to activate an 'i' help hover
WebElement parent = element.findElement(By.xpath(".."));
click(parent);
【讨论】:
非常感谢您提供此解决方案。我尝试了与您所说的相同的方法。我将焦点放在父元素上,然后单击 Tab 键。有效。我认为这是 Chrome 问题,但正如您所说,这是由于 SalesForce 及其工具提示最近的一些更新。 谢谢安基塔。我删除了选项卡,因为它在进一步测试中并不总是有效并且显得多余。我也在研究获取 activeElement 以查看弹出帮助文本的替代 Tab/Shift-Tab 方法是否可行。这是 20 年前我的第一个自动化解决方法。 我真的可以为我微薄的声誉使用一些向上箭头。 :) @DarkArtsWizard 我又面临一个问题。我可以将鼠标悬停在调试模式下,但运行时它不起作用。我尝试添加一些等待并尝试减慢硒速度。但它不起作用。我还尝试使用 javascript 鼠标悬停。那也没有用。我会尝试更多地探索。如果您遇到其他解决方案,请告诉我。 @DarkArtsWizard 很高兴听到您在自动化方面拥有如此丰富的经验。【参考方案2】:根据https://github.com/salesforce/lwc/issues/2333#issuecomment-848378833,解决方法是降级ChromeDriver。
【讨论】:
【参考方案3】:对于 ChromeDriver 90 及更高版本,您可以使用dispatchEvent()
,如下所示。
var javaScriptExecutor = (IJavaScriptExecutor)webDriver;
javaScriptExecutor.ExecuteScript("arguments[0].dispatchEvent(new MouseEvent('mouseover', 'bubbles': true ));", element);
【讨论】:
也可以用于点击事件。 (我的情况需要bubbles
。)javaScriptExecutor.ExecuteScript("arguments[0].dispatchEvent(new MouseEvent('click', 'bubbles': true ));", element);
【参考方案4】:
我在单击 Salesforce 按钮时遇到了同样的问题。 到目前为止,基于 nobyk 解决方案的 JavaScript 变通方法有效。
JavascriptExecutor javascriptExecutor = (JavascriptExecutor) driver;
javascriptExecutor.executeScript("arguments[0].focus(); arguments[0].click()", element);
【讨论】:
【参考方案5】:这是从 chrome 驱动程序版本 90 引入的错误。 这是跟踪此问题的缺陷: https://bugs.chromium.org/p/chromedriver/issues/detail?id=3791
像 moveToElement、dbclick 等动作类方法似乎从 chrome 驱动程序版本 90 中被破坏。尤其是当元素位于影子 DOM 父级中时。
我建议使用 chrome 89 降级到 chrome 浏览器 89(以防止自动更新) Chromium 89.0.4350.6 chromedriver 89
【讨论】:
以上是关于javascript错误:ShadowRoot上不允许使用Robot Framework进行鼠标悬停的方法“elementsFromPoint”的主要内容,如果未能解决你的问题,请参考以下文章
ReferenceError: ShadowRoot 未定义 Jest 和 Vue3
如何获取包含 shadowRoot 元素的文档或节点中的所有 HTML
为啥我的 JavaScript 代码会收到“请求的资源上不存在 'Access-Control-Allow-Origin' 标头”错误,而 Postman 却没有?
为啥我的 JavaScript 代码会收到“请求的资源上不存在 'Access-Control-Allow-Origin' 标头”错误,而 Postman 却没有?
为啥我的 JavaScript 代码会收到“请求的资源上不存在 'Access-Control-Allow-Origin' 标头”错误,而 Postman 却没有?
为啥我的 JavaScript 代码会收到“请求的资源上不存在 'Access-Control-Allow-Origin' 标头”错误,而 Postman 却没有?