今天學習selenium ,折騰了一整天,寫個筆記記錄一下今天的錯誤。
我用的是java+webdriver,在eclipse中運行,今天的學習是進行網易郵箱的登錄功能。一開始代碼運行一直報找不到元素,而我試用了id,xpath等方法都失敗了。
差不多的代碼,在百度上卻能正常登錄,我搜索了一下,發現是我的第一個問題,沒有切換框架。
如圖
因為沒有切換到iframe,所以才會找不到元素,那么,添加了以下的代碼呢?
driver.switchTo().frame(“x-URS-iframe”);
這個代碼是我看了很多人的帖子之后添加的,完全就是復制黏貼,但是我還是太天真了,這次報的錯是“沒有找到這個frame”。
為什么呢?這時我打開網頁和頁面查看工具,在無數次的打開和關閉中,我終於發現了每次的數字都在變化,也就是說,他是動態的,包括用戶名輸入框和密碼輸入框,他們的id也是動態的。
我對前端的掌握只是皮毛,不知道還有動態id這種操作,知道問題之后,度娘起來就更有目標性了。最后,我自己嘗試了一下,將代碼修改成如下:
1 @Test 2 public void testEmail() throws InterruptedException { 3 //隱式等待,等待頁面全部元素加載出來 4 driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); 5 WebElement iframe = driver.findElement(By.tagName("iframe")); 6 String id = iframe.getAttribute("id"); 7 if(id != null) { 8 driver.switchTo().frame(id); 9 } 10 Thread.sleep(5000); 11 WebElement username = driver.findElement(By.name("email")); 12 WebElement password = driver.findElement(By.name("password")); 13 WebElement button = driver.findElement(By.id("dologin")); 14 15 username.sendKeys("賬號"); 16 password.sendKeys("密碼"); 17 button.click(); 18 19 }
既然iframe的id是動態的,那么可以通過tagname先獲取了,然后通過getAttribute方法獲取動態id,而賬號密碼的輸入框,則可以用他們固定的屬性name來獲取。
這段代碼還添加了隱式等待和線程的sleep,一開始沒有添加的時候,一直顯示沒有找到元素,還是翻閱了書才知道可能是因為網頁還沒加載出來而程序已經運行了。一開始沒有添加Thread.sleep(5000),然后發現程序的成功運行變成了一個概率問題,有時候能運行,有時候又不能運行,翻閱資料之下添加了這一行代碼,就能成功了。
一番操作下來,感覺實現一次用戶登錄的自動化測試耗時挺長的,我還在學習,知道自己這么寫肯定不是最優的方法,但不知道如何優化才能讓代碼更加有效率。如果文章有不足或者可以改進的地方,請看官指出,我會虛心接受指導。