import io.github.sukgu.*;
Shadow shadow = new Shadow(driver);
WebElement element = shadow.findElement("properties-page#settingsPage>textarea#textarea");
String text = element.getText();
_driver.Navigate().GoToUrl("http://watir.com/examples/shadow_dom.html");
var shadowHost = _driver.FindElement(By.CssSelector("#shadow_host"));
var shadowRoot = shadowHost.GetShadowRoot();
var shadowContent = shadowRoot.FindElement(By.CssSelector("#shadow_content"));
let appComponent = document.body.querySelector("app-component") as HTMLElement;
let appHeader = this.getHTMLElementWithShadowRoot(appComponent, ["main-component", "header-component", "#app-header"]);
6条答案
按热度按时间nkkqxpd91#
有一个很好的插件可以和selenium项目shadow-automation-selenium一起使用。它有助于编写更好的,可读性和可维护的代码。使用它你可以访问多级shadow DOM(最多4级)。它使用简单的css选择器来识别元素。
WebElement findElement(String cssSelector)
:如果需要DOM中的单个元素,请使用此方法List<WebElement> findElements(String cssSelector)
:如果要从DOM中查找所有元素,请使用此函数WebElement findElements(WebElement parent, String cssSelector)
:如果您想从父对象DOM中查找单个元素,请使用此函数List<WebElement> findElements(WebElement parent, String cssSelector)
:如果要从父对象DOM中查找所有元素,请使用此函数WebElement getShadowElement(WebElement parent,String selector)
:如果要从父DOM中查找单个元素,请使用此函数List<WebElement> getAllShadowElement(WebElement parent,String selector)
:如果要查找父DOM中的所有元素,请使用此函数boolean isVisible(WebElement element)
:如果要查找元素的可见性,请使用此选项boolean isChecked(WebElement element)
:如果要检查是否选中复选框,请使用此选项boolean isDisabled(WebElement element)
:如果要检查元素是否已禁用,请使用此选项String getAttribute(WebElement element,String attribute)
:如果您想获得像aria-selected这样属性和元素的其他自定义属性,请使用此函数。void selectCheckbox(String label)
:使用此选项选择使用标签的复选框元素。void selectCheckbox(WebElement parentElement, String label)
:使用此选项选择使用标签的复选框元素。void selectRadio(String label)
:使用此选项选择使用标签的无线电元素。void selectRadio(WebElement parentElement, String label)
:使用此选项从使用标签的父DOM中选择单选元素。void selectDropdown(String label)
:使用此选项使用标签选择下拉列表项(如果UI上仅存在或加载了一个下拉列表,则使用此选项)。void selectDropdown(WebElement parentElement, String label)
:使用此选项从使用标签的父DOM中选择下拉列表项。如何使用此插件:你将不得不依赖于你的项目.
玛文
对于驻留在shadow-root dom元素下的html标记
您可以在框架中使用这段代码来获取textarea元素Object。
型
vu8f3i0k2#
使用JSExecutor和CSS查找阴影DOM元素的步骤:
1.找出影子根元素的基元素即父元素。
1.获取该元素的影子根。
1.在暗根网络元素上找到你的元素
示例:
找出阴影根元素的方法
型
Step1示例,即查找基本元素:
步骤2
Step3 -我们需要使用CSS选择器查找影子根目录中的元素,xpath在这里不起作用
bvuwiixz3#
对于Selenium 4,现在有
WebElement.getShadowRoot()
。与
#shadow-root
的正常情况一样,下一跳的导航选项有限。例如,对于Chrome,By.cssSelector()
和By.className()
有效,但By.id()
和By.tagName()
在org.openqa.selenium.InvalidArgumentException: invalid argument: invalid locator
下失败x0fgdtte4#
为了演示使用 Selenium v3.x、ChromeDriver v2.46 和 Chrome v73.x 的 shadow DOM 的 * 自动化 ,这里有两种方法,它们打开url
chrome://downloads/
,并使用executeScript()
方法发送 * 字符序列pdf作为 * 搜索框 * 中的 * 搜索文本 *。使用
document.querySelector()
作为规范方法,您可以使用
document.querySelector()
方法,如下所示:相同的解决方案可以逐步改写如下:
结束
根据Determine the fate of experimental '>>>' combinator中的讨论,**
>>>
组合子是用于穿透所有阴影DOM边界以进行样式的/deep/
**组合子的替代,在Blink中的标志后面实现。u1ehiz5o5#
Chrome v96(及更高版本)和Selenium中的阴影DOM
随着Chrome v96的推出,google-chrome已经使其shadow root返回值符合W3C WebDriver规范。
正如
@titusfortner
在他们的评论中提到的:现在Chrome通过驱动程序支持shadow root,shadow Root JS调用会根据规范返回一个shadow root元素键(shadow-6066- 11 e4-a52 e-4f 735466 cecf)。Selenium 4有一个新的ShadowRoot类来支持这一点,但我们没有包含执行脚本调用返回元素时所做的转换代码。这个问题已经得到修复,将在Selenium 4.1中提供。
唯一的区别是您需要强制转换到ShadowRoot而不是WebElement。
因此,在Microsoft Edge和Google Chrome v96及更高版本中继续使用Selenium时,我们需要使用新的影子根方法,如下所示:
时间;日期
更多信息请访问:
okxuctiv6#
我可以使用这个递归函数访问多级shadow-root DOM元素。
我这样使用:
在这里您可以看到DOM x1c 0d1x
您必须在数组字符串nameHtmlElements中写入下划线名称,但不包括名字,因为名字是在函数的第一个参数中传递的。