2016-11-16 39 views
0

我有下面的代碼塊,使用動作序列來執行以下操作:Webdriverjs沒有睡眠語句陳舊元件引用

  • 點擊一個鏈接到頁面
  • 等待一個輸入字段在頁面上出現
  • 點擊輸入框
  • 刪除存在
  • 發送鍵序列輸入一個位置
  • 喜的任何文本t爲向下箭頭(輸入採用autcomplete)
  • 按下回車鍵來選擇正確的位置
  • 點擊保存按鈕

我已閱讀,使用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

有一個問題可能是從locsave的頁面中截取並實際使用它們。嘗試重新排列代碼如下,看看是否有幫助。

我注意到的另一件事driver.wait()返回的元素等待,所以你可以合併行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() 
+0

與您的代碼相同的結果(雖然它更清潔)。如果我不使用第一個'driver.sleep(3000)',那麼自動完成文本無論出於何種原因都無法正確填充。我想完全擺脫睡眠聲明,但是我似乎無法在沒有它們的情況下運作。 – jmreicha

+0

你應該試着弄清楚睡眠正在完成的是什麼。在第一種情況下,您是否可以檢測到自動填充文本正在填充?它是用HTML顯示的嗎? – JeffC

+0

不幸的是,我很難搞清楚如何檢測自動完成,因爲選項不在DOM中顯示。 – jmreicha