java+selenium 實現網易郵箱登入功能
今天學習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),然後發現程式的成功執行變成了一個概率問題,有時候能執行,有時候又不能執行,翻閱資料之下添加了這一行程式碼,就能成功了。
一番操作下來,感覺實現一次使用者登入的自動化測試耗時挺長的,我還在學習,知道自己這麼寫肯定不是最優的方法,但不知道如何優化才能讓程式碼更加有效率。如果文章有不足或者可以改進的地方,請看官指出,我會虛心接受指導。