【问题标题】:Is there any way to get element info inside the shadow root with Selenium?有没有办法用 Selenium 获取影子根中的元素信息?
【发布时间】:2018-02-19 23:09:32
【问题描述】:

我正在尝试使用 java 和 selenium 从网站上抓取一些信息。但是,由于 shadow-root 我无法访问任何 Web 元素。当我尝试获取 html 时,它返回空数组。有什么方法可以访问 shadow-root 中的信息还是不可能? html structure of the website

【问题讨论】:

  • 您能否使用基于文本的格式化相关 HTML、您的代码试验和错误堆栈跟踪来更新问题?

标签: java selenium web-crawler shadow-dom


【解决方案1】:

您可以尝试 JavascriptExecutor 在 shadow-root 中查找元素。

WebElement rootElement = (WebElement) ((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot", PreRootElement);

详情请参考:http://www.seleniumeasy.com/selenium-tutorials/accessing-shadow-dom-elements-with-webdriver

【讨论】:

    【解决方案2】:

    Mavni 的回答为我解决了这个问题,但作为改进,我希望能够使用 By 作为定位器(例如等待 ExpectedCondition)。

    public class ByShadowRoot extends By {
    
        @Override
        public WebElement findElement( SearchContext context ) {
    
            RemoteWebElement element = ( RemoteWebElement ) context;
            JavascriptExecutor driver = ( JavascriptExecutor ) element.getWrappedDriver();
            return ( WebElement ) driver.executeScript( "return arguments[0].shadowRoot" , element );
        }
    
        @Override
        public List<WebElement> findElements( SearchContext context ) {
    
            WebElement element = findElement( context );
            return element != null ? Collections.singletonList( element ) : Collections.emptyList();
        }
    
        @Override
        public String toString() {
    
            return "By#shadow-root";
        }
    }
    

    然后这样使用(本示例用于等待在 Vaadin Flow 中弹出 ComboBox):

    ByShadowRoot byShadowRoot = new ByShadowRoot();
    By comboBoxItem = new ByChained( By.id( "overlay" ) , byShadowRoot , By.id( "content" ) , byShadowRoot , By.id( "selector" ) ,
        By.tagName( "vaadin-combo-box-item" ) );
    

    ByChained 在 selenium-support.jar 中)

    如果By.tagName() 紧跟在byShadowRoot 之后,则WebDriverException: unknown error: b.getElementsByTagName is not a function 会失败。我认为这是因为#shadow-root 只是 DOM 中的一个文档片段,而不是一个文档元素。

    【讨论】:

      猜你喜欢
      • 2019-09-23
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2021-03-09
      相关资源
      最近更新 更多