如何使用selenium webdriver点击链接

时间:2017-01-12 17:54:48

标签: javascript selenium selenium-webdriver

如何使用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();

2 个答案:

答案 0 :(得分:2)

使用util.inspect()功能检查对象:

const util = require('util');
...
console.log(util.inspect(simLinks));

执行此操作后,您会发现simLinksManagedPromise,因此您需要按照以下方式更改代码才能使其正常工作:

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中。