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 却没有?