首先简单总结一下selenium定位方法:
首先是HTML中如何定位
1.id定位 findElement(By.id("kw"))
2.name定位 findElement(By.name("wd"))
3class定位 findElement(By.className("s_ipt"))
4.tag定位 findElement(By.tagName("input"))
link定位:
findElement(By.linkText("新闻"))
Xpath定位:
findElement(By.xpath("//input[@id='kw']"))
如果不想指定标签名,则也可以用星号(*)代替 层级与属性结合定位:
findElement(By.xpath("//span[@class='bg s_ipt_wr']/input")) span[@class='bg s_ipt_wr']
通过class 属性定位到父元素,后面/input 就表示父元素下面的子元素。如果父元 素没有可利用的属性值,那么可以继续向上查找“爷爷”元素。 findElement(By.xpath("//input[@id='kw' and @class='su']/span/input"))
用任何方法定位163/126邮箱登录页面的元素都不可能定位到,eclipse工作台会显示Unable to locate element:…… 一种属于frame嵌套问题,应先进入frame层级之后在进行定位 CSS定位: 通过class 属性定位: findElement(By.cssSelector(".s_ipt")) 通过id 属性定位: findElement(By.cssSelector("#kw")) findElement(By.cssSelector("input[autocomplete='off']")) findElement(By.
解决方案一: 因为126/163邮箱是在iframe中又嵌套了一个页面,所以首先需要先进入到iframe,代码如下: //启动Chrome浏览器 WebDriver driver = new ChromeDriver(); driver.get(http://mail.163.com/); //进入iframe driver.switchTo().frame("x-URS-iframe"); //定位账号、密码、登录 driver.findElement(By.cssSelector("[class='j-inputtext dlemail']")).sendKeys("username"); driver.findElement(By.cssSelector("[class='j-inputtext dlpwd']")).sendKeys("password"); driver.findElement(By.xpath("//div[@class='f-cb loginbox']/a")).click(); driver.quit() 再次启动之后,就会出现你需要的结果。
解决方案二: 由于网速问题,页面加载慢,有时候也会出现定位不到的可能,eclipse工作台会显示Unable to locate element:…… 这时需要在启动浏览器并打开网址后,添加: Thread.sleep(10000);