今天学习selenium ,折腾了一整天,写个笔记记录一下今天的错误。
我用的是java+webdriver,在eclipse中运行,今天的学习是进行网易邮箱的登录功能。一开始代码运行一直报找不到元素,而我试用了id,xpath等方法都失败了。
差不多的代码,在百度上却能正常登录,我搜索了一下,发现是我的第一个问题,没有切换框架。
如图
因为没有切换到iframe,所以才会找不到元素,那么,添加了以下的代码呢?
driver.switchTo().frame(“x-URS-iframe”);
这个代码是我看了很多人的帖子之后添加的,完全就是复制黏贴,但是我还是太天真了,这次报的错是“没有找到这个frame”。
为什么呢?这时我打开网页和页面查看工具,在无数次的打开和关闭中,我终于发现了每次的数字都在变化,也就是说,他是动态的,包括用户名输入框和密码输入框,他们的id也是动态的。
我对前端的掌握只是皮毛,不知道还有动态id这种操作,知道问题之后,度娘起来就更有目标性了。最后,我自己尝试了一下,将代码修改成如下:
1 @Test2 public void testEmail() throwsInterruptedException {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),然后发现程序的成功运行变成了一个概率问题,有时候能运行,有时候又不能运行,翻阅资料之下添加了这一行代码,就能成功了。
一番操作下来,感觉实现一次用户登录的自动化测试耗时挺长的,我还在学习,知道自己这么写肯定不是最优的方法,但不知道如何优化才能让代码更加有效率。如果文章有不足或者可以改进的地方,请看官指出,我会虚心接受指导。