如何使用selenium webdriver
从页面中获取具有属性a[href*=/simulation/form/]
的所有链接,然后打开和关闭每个链接?
我尝试了以下代码,但它返回TypeError: link.click is not a function
var simLinks = driver.findElements(By.css('a[href*=/simulation/form/]'));
for(var link in simLinks){
link.click();
driver.wait(30000);
driver.back();
}
如果我console.log(simLinks.length)
,则会返回undefined
相反,如果我尝试打开该类型的单个链接,它会很完美:
var simLinks = driver.findElement(By.css('a[href*=/simulation/form/]')).click();
答案 0 :(得分:2)
使用util.inspect()
功能检查对象:
const util = require('util');
...
console.log(util.inspect(simLinks));
执行此操作后,您会发现simLinks
是ManagedPromise
,因此您需要按照以下方式更改代码才能使其正常工作:
driver.findElements(By.css('a[href*="/simulation/form/"]')).then(function (simLinks) {
for (let link of simLinks) {
link.click();
driver.wait(until.urlContains('/simulation/form/', 30000));
driver.navigate().back();
}
});
然而,问题在于只有第一次点击才有效,但是一旦你导航回来就有一个合法的StaleElementReferenceError
- 页面确实发生了变化,循环中的下一个元素不再附加到可见的页面。因此,更好的策略是收集链接地址,并将其与driver.navigate().to(link)
:
driver.findElements(By.css('a[href*="/simulation/form/"]')).then(function (simLinks) {
var hrefs = simLinks.map(link => link.getAttribute('href'));
for (let link of hrefs) {
driver.navigate().to(link);
driver.wait(until.urlContains('/simulation/form/', 30000));
driver.navigate().back();
}
});
答案 1 :(得分:0)
我相信你应该使用:
的console.log(simLinks.size())
我不知道javascript中是否需要() - 它在java中。