我有以下代码块,它使用动作序列来执行以下操作:
我已经读过,建议不要使用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
错误?
答案 0 :(得分:0)
一个问题可能是抓取loc
和save
的网页并实际使用它们之间的时间。尝试重新排列代码如下,看看是否有帮助。
我注意到的另一件事,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()