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

时间:2018-03-01 14:47:50

标签: selenium selenium-webdriver

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

我怎样才能确定,特定元素(在这个特殊情况下,在阴影dom中加载延迟)已经存在? 我发现了这个:

driver.wait(until.elementLocated(By.id('foo')), 10000);

但是这会搜索整个DOM。

我在shadow DOM中,并使用此函数将阴影树扩展为新的WebElement:

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

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

1 个答案:

答案 0 :(得分:0)

我提出了以下解决方案:

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'中记录控件值(selector是name属性)。