我可以等待selenium webdriver中出现子元素吗

我可以等待selenium webdriver中出现子元素吗,selenium,selenium-webdriver,Selenium,Selenium Webdriver,我想用selenium-webdiver.js查找一个深层嵌套元素 如何确保特定元素(在这个特殊情况下是在影子dom中加载的惰性元素)已经存在? 我发现: driver.wait(until.elementLocated(By.id('foo')), 10000); 但这会在整个DOM中搜索 我在shadow DOM中,使用以下函数将shadow树扩展为一个新的WebElement: const expandShadowElement = function(driver, element) {

我想用selenium-webdiver.js查找一个深层嵌套元素

如何确保特定元素(在这个特殊情况下是在影子dom中加载的惰性元素)已经存在? 我发现:

driver.wait(until.elementLocated(By.id('foo')), 10000);
但这会在整个DOM中搜索

我在shadow DOM中,使用以下函数将shadow树扩展为一个新的WebElement:

const expandShadowElement = function(driver, element) {
  return driver.executeScript('return arguments[0].shadowRoot', 
  element);
};
const elShadowContent = expandShadowElement(driver, elShadowRoot);

所以我想,我需要一些东西,作为elShadowContent的子元素开始搜索(并等待)。

我想出了以下解决方案:

const defaultTimeout = 30000;

const waitForElement = function(css, startElem = driver){
  return driver.wait( () =>
    startElem.findElements(By.css(css))
      .then(elements => {
        if(elements.length === 0){
          return false; // element not found
        } else {
          return elements[0].isDisplayed()
            .then( displayed => displayed ? elements[0] : false);
        }
      })
    , defaultTimeout);
};

const expandShadowElement = function(css) {
  const element = waitForElement(css);
  return driver.executeScript('return arguments[0].shadowRoot',
    element);
};

driver.get(someUrl)
  .then(() => expandShadowElement('my-shadow-container'))
  .then(expanded => waitForElement("[name='input_1']", expanded))
  .then(el => el.getAttribute('value'))
  .then(val => console.log(val));
此示例在阴影dom容器元素“my shadow container”中记录控件值(选择器是name属性)