Javascript 如何使用SeleniumWebDriver单击链接

Javascript 如何使用SeleniumWebDriver单击链接,javascript,selenium,selenium-webdriver,Javascript,Selenium,Selenium Webdriver,如何使用selenium webdriver从页面中获取具有属性a[href*=/simulation/form/]的所有链接,然后打开和关闭每个链接 我尝试了以下代码,但它返回TypeError:link.click不是函数 如果执行console.log(simLinks.length)操作,则返回undefined 相反,如果我尝试打开该类型的单个链接,则效果会非常好: var simLinks = driver.findElement(By.css('a[href*=/simulati

如何使用
selenium webdriver
从页面中获取具有属性
a[href*=/simulation/form/]
的所有链接,然后打开和关闭每个链接

我尝试了以下代码,但它返回
TypeError:link.click不是函数

如果执行
console.log(simLinks.length)
操作,则返回
undefined

相反,如果我尝试打开该类型的单个链接,则效果会非常好:

var simLinks = driver.findElement(By.css('a[href*=/simulation/form/]')).click();

我认为您应该使用:

console.log(simLinks.size())

我不知道javascript中是否需要(),它是java中的。

使用
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()一起使用。转到(link)


simLinks的类型是什么?simLinks应该包含属性为
'a[href*=/simulation/form/]
的所有元素。我发现在Java中,它的实现方式类似于
List simLinks=driver.findElements(By.css('a[href*=/simulation/form/')
,但我使用的是javascript。我使用的是
javascript
,而不是
java
,我仍然得到了这个错误
TypeError:link.click不是一个函数
,但好的是控制台返回2个
WebElement
对象,它们是我的linksAh,事实上,
simLinks
是一个数组。我相应地修正了答案,现在应该可以了:)。谢谢,应该可以了,但是现在它抛出了
ElementNotVisibleError
。为什么该元素在登录到控制台后就不可见了?仅供参考,我还尝试通过.css('a[data ga name=“Property Summary:Edit Simulation”]“。页面上的链接是这样的:
我用谷歌尝试了这个例子,第一次点击就成功了。但是一旦你返回,就会出现一个合法的
StaleElementReferenceError
——页面确实发生了变化,循环中的下一个元素不再附加到可见页面上。我会想一想如何处理这个问题这
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();
  }
});
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();
  }
});