当前位置: 首页 > 知识库问答 >
问题:

selenium webDrive-和访问影子dom

轩辕经赋
2023-03-14

我正在测试一个使用shadow dom的新应用程序,如下所示:

 #shadow-root (open)
    <div class="th_filePicker">
        <div class="th_fp_header">
            <div class="th_fp_title" role="heading" aria-level="1" data-l10n-id="th_fp_title">Select Image</div>
                <div class="th_fp_Close"><button class="close-popup" data-l10n-id="close_popup" title="Close"></button></div>
        </div>
    </div>

有人知道我如何访问文件选择器控件中的元素吗?特别是关闭图标?

共有3个答案

高功
2023-03-14

这是可能的,但需要几步。作为预备,请查看关于访问shadowdom的页面。我发现它真的很有用。

从两种方法开始获取shadowdom元素:

private WebElement shadowDom;

private WebElement expandRootElement(WebElement element) {
    WebElement ele = (WebElement) ((JavascriptExecutor) driver)
        .executeScript("return arguments[0].shadowRoot",element);
    return ele;
}
private void findByShadowRoot(WebDriver driver) {
    shadowDom = expandRootElement(
        driver.findElement(By.id("whatEverTheShadowDomIdIs")));
}

从那里,您可以创建作为伪POM的方法

private WebElement findByShadowButton() {
    findByShadowRoot(driver);
    return shadowDom.findElement(By.cssSelector("div.th_fp_Close"));
}

基本上,前两个方法用于创建一个起点,然后所有其他方法调用这些方法并说,“从这个起点,找到它下面的元素”。

然后,您可以使用以下语句:

findByShadowButton().click();
元鸿波
2023-03-14

您可以尝试这种“沉重”的方法(C#但取决于您的语言,它可能是这样的):

public IWebElement DeepFind(By search)
{
    try
    {
        // search a result in the main dom
        return Driver.FindElement(search);
    }
    catch (NoSuchElementException)
    {
        // if nothing we will take a look to the shadow dom(s)
        var shadowRoots = new List<IWebElement>();
        try
        {
            // will use the recursive method that search for all shadow roots
            ListShadowRoots(search, Driver.FindElements(By.XPath("//*")), shadowRoots);
        }
        catch (NoSuchElementException)
        {
            //
        }
        // return the first element that match the By search
        return shadowRoots.FirstOrDefault(s => s.FindElement(search) != null);
    }
}

private void ListShadowRoots(By search, ReadOnlyCollection<IWebElement> elements, List<IWebElement> shadowRoots)
{
    elements.ToList().ForEach(e =>
    {
        var jsResult = (IWebElement)ExecuteJavascript("return arguments[0].shadowRoot", new object[] { e });
        if (jsResult != null)
        {
            shadowRoots.Add(jsResult);
            try
            {
                ListShadowRoots(search, jsResult.FindElements(By.XPath("//*")), shadowRoots);
            }
            catch (NoSuchElementException)
            {
                //
            }
        }
    });
}

private object ExecuteJavascript(string code, object[] args)
{
    IJavaScriptExecutor js = (IJavaScriptExecutor)Driver;
    js.ExecuteScript(code, args);
}

驱动程序是Web驱动程序(IWebDriver)

表演不是那么糟糕,它做的工作;)希望它能有所帮助

颛孙昆
2023-03-14

一种方法是使用穿刺CSS选择器(/深层/

这一款应为您提供Chrome 62的关闭按钮:

driver.findElement(By.css("* /deep/ button[title='Close']"))

 类似资料:
  • shadowdom结构:在上面的shadowdom结构中,我们可以在chrome中使用selenium和javascript访问各个元素,如下所示: 在Firefox中://div[@class='Style-Sconk-tabs'而不是(@隐藏)]//div/span[包含(text(),'AttrName')]/.../前驱兄弟姐妹::div/puch-icon-按钮[1]/铁图标[1] 在C

  • 我可以通过以下方式访问dev中的用户名: 有没有其他方法可以通过webdriver访问ShadowDOM元素?

  • 正在尝试访问中男式外饰部分下的“立即购买”按钮https://shop.polymer-project.org/在chrome浏览器(V51)的JS控制台上使用以下代码: 我试图在我的自动化测试中访问相同的元素,使用selenium,第1行:

  • 是否可以使用Selenium/Chrome WebDriver访问影子DOM中的元素? 有人成功了吗?

  • 有没有可能用蟒蛇硒在阴影DOM中找到元素? 示例用例: 我用输入了这个

  • 基本上,我想访问一个出现在打印预览弹出窗口中的按钮,这是一个阴影dom元素。我尝试了一些我在stackoverflow周围找到的解决方案,但是它们不起作用,就像我试图构建的当前代码一样,它是: 检查元素打印