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

如何使用硒自动化阴影DOM元素?

左丘昕
2023-03-14

我使用JavaSelenium项目进行网页自动化。网页包含了许多多级的影子根DOM元素,我无法使用seleniumfindElement方法与它们交互。

  • 深度css(不适用于最新的chrome浏览器)
  • 执行人。(这真的很乏味,维护起来也很复杂)

如果你知道除了上面列出的任何其他解决方案,我可以在SeleniumJava框架中实现,请传递解决方案。提前感谢!。

共有3个答案

萧丁雨
2023-03-14

使用JSExecutor和CSS查找阴影DOM元素的步骤:

>

  • 找出基本元素,即阴影根元素的父元素。

    获取该元素的阴影根。

    并在影子根webelement上找到您的元素

    例子:

    <div id="example">
    #shadow-root
    <div id="root" part="root">
       <div id="label" part="label">ShadowRootLabel</div>
    </div>
    </ptcs-label>

  • 潘凯
    2023-03-14

    为了演示使用Selenium v3. x、ChromeDriver v2.46和Chromev73. x实现影子DOM的自动化,这里有几种方法可以打开urlchrome://下载/,并使用执行脚本()方法发送字符将pdf排序为搜索框中的搜索文本。

    作为规范方法,您可以使用文档。querySelector()方法如下:

    >

    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;
    
    public class shadow_DOM_search_download_querySelector {
    
        public static void main(String[] args)
        {
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("start-maximized");
            options.addArguments("disable-infobars");
            options.addArguments("--disable-extensions"); 
            WebDriver driver = new ChromeDriver(options);
            driver.get("chrome://downloads/");
            JavascriptExecutor jse = (JavascriptExecutor) driver; 
            WebElement search_box = (WebElement) jse.executeScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('downloads-toolbar#toolbar').shadowRoot.querySelector('cr-toolbar#toolbar').shadowRoot.querySelector('cr-toolbar-search-field#search').shadowRoot.querySelector('div#searchTerm input#searchInput')");
            String js = "arguments[0].setAttribute('value','pdf')";
            ((JavascriptExecutor) driver).executeScript(js, search_box);
        }
    }
    

    相同的解决方案可以按如下步骤重新编写:

    >

    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;
    
    public class shadow_DOM {
    
        static WebDriver driver;
        public static void main(String[] args) 
        {   
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("start-maximized");
            //options.addArguments("disable-infobars");
            options.addArguments("--disable-extensions"); 
            driver = new ChromeDriver(options);
            driver.get("chrome://downloads/");
            WebElement root1 = driver.findElement(By.tagName("downloads-manager"));
            WebElement shadow_root1 = expand_shadow_element(root1);
    
            WebElement root2 = shadow_root1.findElement(By.cssSelector("downloads-toolbar#toolbar"));
            WebElement shadow_root2 = expand_shadow_element(root2);
    
            WebElement root3 = shadow_root2.findElement(By.cssSelector("cr-toolbar#toolbar"));
            WebElement shadow_root3 = expand_shadow_element(root3);
    
            WebElement root4 = shadow_root3.findElement(By.cssSelector("cr-toolbar-search-field#search"));
            WebElement shadow_root4 = expand_shadow_element(root4);
    
            WebElement search_term = shadow_root4.findElement(By.cssSelector("div#searchTerm input#searchInput"));
            String js = "arguments[0].setAttribute('value','pdf')";
            ((JavascriptExecutor) driver).executeScript(js, search_term);
    
            WebElement search_button = shadow_root4.findElement(By.cssSelector("paper-icon-button#icon"));
            search_button.click();
    
            System.out.println("Search Button Clicked");
        }
    
        public static WebElement expand_shadow_element(WebElement element)
        {
            WebElement shadow_root = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot", element);
            return shadow_root;
        }
    
    }
    

    >

    Search Button Clicked
    
    • 浏览器快照:

    根据《确定实验对象的命运》中的讨论

    • 使/deep/像CSS live概要文件(在CSS文件或内部)中的后代组合符“”一样工作。
    井镜
    2023-03-14

    有一个非常好的插件可以与selenium project shadow automation selenium一起使用。它有助于编写更好的、可读的和可维护的代码。使用此选项,您可以访问多级阴影DOM(最多4级)。这使用简单的css选择器来标识元素。

    WebElement findelelement(String cssSelector):如果需要来自DOM的单个元素,请使用此方法

    列表

    WebElement findElements(WebElement父对象,String cssSseltor):如果您想从父对象DOM中查找单个元素,请使用此选项

    列表

    WebElement getShadowElement(WebElement父元素,字符串选择器):如果要从父DOM中查找单个元素,请使用此选项

    列表

    boolean isVisible(WebElement元素):如果要查找元素的可见性,请使用此选项

    布尔isChecked(WebElement):如果要检查是否选中复选框,请使用此选项

    布尔isDisabled(WebElement元素):如果要检查元素是否已禁用,请使用此选项

    String getAttribute(WebElement元素,String属性):如果您想获得属性,如选定的aria和元素的其他自定义属性,请使用此选项。

    val selectCheckbox(String标签):使用标签选择复选框元素。

    void selectCheckbox(WebElement parentElement,String label):使用此选项选择使用标签的复选框元素。

    void selectRadio(字符串标签):使用此选项可使用标签选择无线电元素。

    val selectRadio(WebElement父母元素,字符串标签):使用此选项从使用标签的父DOM中选择无线电元素。

    void selectDropdown(字符串标签):使用此选项选择使用标签的下拉列表项(如果UI上只存在或加载了一个下拉列表项,则使用此选项)。

    void selectDropdown(WebElement parentElement,String label):使用此选项可以使用label从父DOM中选择下拉列表项。

    如何使用这个插件:你将不得不在你的项目依赖。

    专家

    <dependency>
      <groupId>io.github.sukgu</groupId>
      <artifactId>automation</artifactId>
      <version>0.0.4</version>
    <dependency>
    

    用于驻留在阴影根dom元素下的html标记

    <properties-page id="settingsPage"> 
      <textarea id="textarea">
    </properties-page>
    

    您可以在框架中使用此代码获取textarea元素对象。

      import io.github.sukgu.*;
      Shadow shadow = new Shadow(driver);
      WebElement element = shadow.findElement("properties-page#settingsPage>textarea#textarea");
      String text = element.getText();
    

     类似资料:
    • 问题内容: 我正在使用Java Selenium项目进行网页自动化。该网页包含许多我无法使用selenium 方法进行交互的多层影子根DOM元素。 我尝试了以下解决方案: Deep CSS(不适用于最新的Chrome浏览器) JS执行器。(这确实很繁琐,并且维护起来很复杂) 注意: 如果您知道我可以在Selenium Java框架中实现的除以上所列之外的任何其他解决方案,请传递该解决方案。提前致谢

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

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

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

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

    • 量角器1.7.0引入了一个新特性:一个新的定位器,它有助于查找阴影DOM中的元素。 它涵盖哪些用例?您希望何时访问阴影DOM中的元素? 我问这个问题的原因是我错过了这个问题的动机部分——我认为量角器主要是一个有助于模仿真实用户交互的高级框架。访问阴影树听起来像是一件非常深入的技术事情,你为什么要这么做让我困惑。