我可以等待selenium webdriver中出现子元素吗
我想用selenium-webdiver.js查找一个深层嵌套元素 如何确保特定元素(在这个特殊情况下是在影子dom中加载的惰性元素)已经存在? 我发现:我可以等待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) {
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属性)