我想用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的子元素。
答案 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属性)。