Webdriverjs没有睡眠语句陈旧元素引用

时间:2016-11-16 00:36:17

标签: javascript selenium selenium-webdriver webdriver

我有以下代码块,它使用动作序列来执行以下操作:

  • 点击指向页面的链接
  • 等待页面上的输入字段显示
  • 点击输入字段
  • 删除任何存在的文字
  • 发送一系列密钥以输入位置
  • 点击向下箭头(输入使用自动完成)
  • 点击回车键选择正确的位置
  • 点击保存按钮

我已经读过,建议不要使用driver.sleep()语句,但如果没有它们,我就无法使代码正常工作。

以下是代码块:

driver.wait(until.elementLocated(By.css("a[href*='details/location']")), 5000)
driver.findElement(By.css("a[href*='details/location']")).click()
driver.wait(until.elementLocated(By.id("user_location")), 5000)
let loc = driver.findElement(By.id("user_location"))
let save = driver.findElement(By.xpath("//span[contains(text(), 'Save')]"))
driver.sleep(3000)
driver.actions().
    click(loc).
    sendKeys(Key.DELETE)
    .sendKeys('My location')
    .perform()
driver.sleep(1000)
driver.actions().
    sendKeys(Key.ARROW_DOWN).
    sendKeys(Key.ENTER).
    perform()
driver.sleep(1000)
driver.actions().
    click(save).
    perform()

有没有更好的方法来执行此操作和/或有没有办法删除睡眠语句?为什么在我发出睡眠语句时会发生stale element错误?

1 个答案:

答案 0 :(得分:0)

一个问题可能是抓取locsave的网页并实际使用它们之间的时间。尝试重新排列代码如下,看看是否有帮助。

我注意到的另一件事,driver.wait()返回等待的元素,因此您可以组合第1行和第1行。 2和3行& 4所以你不必刮两次。

driver.wait(until.elementLocated(By.css("a[href*='details/location']")), 5000).click()
let loc = driver.wait(until.elementLocated(By.id("user_location")), 5000)
# driver.sleep(3000) # you shouldn't need this sleep?
driver.actions()
    .click(loc)
    .sendKeys(Key.DELETE)
    .sendKeys('My location')
    .perform()
driver.sleep(1000)
driver.actions()
    .sendKeys(Key.ARROW_DOWN)
    .sendKeys(Key.ENTER)
    .perform()
driver.sleep(1000)
let save = driver.findElement(By.xpath("//span[contains(text(), 'Save')]"))
driver.actions()
    .click(save)
    .perform()