该篇文章记录本人在学习及使用webdriver做自动化测试时遇到的各种问题及解决方式,问题比较杂乱。问题的解决方式来源五花八门,如有疑问请随时指正一遍改正。
1、WebDriver入门
//webdriver打开浏览器并自动打开相应的测试地址
public static void main(String[] args) {
WebDriver driver = new ChromeDriver(); // create a chrome driver
driver.manage().window().maximize(); // max size the chrome window
driver.get(URL); // open URL with the chrome browser
}
2、webdriver报不可见元素异常方法总结(Element is not currently visible)
1 、用xpath定位时,定位到了两个相同的元素,那么会默认找出第一个元素
某div的脚本如下要想找出该div则必须加上其属性:
<div id="ext-comp-1714" class=" x-window x-window-plain x-window-dlg" style="position: absolute; z-index: 9013; visibility: hidden; display: block;">
WebElement close=driver.findElement(By.xpath("//div[contains(@style,' visibility: hidden')]
也可这样用:driver.findElement
(By.xpath("//div[contains(@style,'visibility: visible')]/div[1] /div[@class='x-tool x-tool-close']"))
3、WebDriver_如何判断WebElement元素对象是否存在
selenium中如果去寻找元素,而元素不存在的话,通常会抛出NoSuchElementException 导致测试失败,但有时候,我们需要去确保页面元素不存在,才是我们正确的验收条件下面的方法可以用来判定页面元素是否存在
4、WebDriver的双击事件
webdriver脚本如下所示,双击没反应
Actions action=new Actions(driver);
action.doubleClick(driver.findElement(By.xpath("//table/tbody/tr/td[10]/div[contains(text(),'测试')]")));
解决方法:.perform()
action.doubleClick(driver.findElement(By.xpath("//table/tbody/tr/td[10]/div[contains(text(),'测试')]"))).perform();
5、Selenium By.Xpath 用法
经典例子:
xpath="//input[@name='wirelessResult'][@value='1']"
xpath="//div[contains(@style,'visibility: visible')]//span/b[contains(text(),'系统异常')]"
findElement(By.xpath("//span[contains(text(),'"+spanContains+"')]"));可以通过传参的方式找到元素
td[not(contains(@style,' display: none'))]
div[@class=' x-panel x-panel-noborder' or @class='x-panel x-panel-noborder']
6、Element已经过时
没有和当前页面进行绑定,主要是页面刷新或者跳转引起的。需要重新获取一次元素,抛出异常如下:
org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
利用PageFactory可以解决该问题
一个下拉框是由div组成的,
7、Selenium中的几种等待方式
编写脚本的过程中一直使用Thread.sleep(3000)设置等待时间,但是这样设置的话存在不稳定因素,容易造成时间的浪费,通过在网上查找,找到如下的解决方法:
1、Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wait)
隐性等待:指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用(实践证明-影响性能)
显式等待:指在代码进行下一步操作之前等待某一个条件的发生。最不好的情况是使用Thread.sleep()去设置一段确认的时间去等待。因为一个元素的加载时间有长有短,你在设置sleep的时间之前要自己把握长短,太短容易超时,太长浪费时间。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间。利用WebDriverWait类和ExpectedCondition接口就能实现这一点。
上面的代码WebDriverWait类的构造方法接受了一个WebDriver对象和一个等待最长时间(10秒)。然后调用until方法,其中重写了ExpectedCondition接口中的apply方法,让其返回一个WebElement,即加载完成的元素,然后点击。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到有成功的返回,当然如果超过设定的值还没有成功的返回,将抛出异常。
备注:如果一个无素没有出现都会默认等待你所设定的时间,直到超时或者元素出现,所以等待的时间也尽量不要设置的太长,影响性能
8、WebDriver执行JS
1)在某个已经定位了的元素上执行js,解决方式:
WebElement ele = driver.findElement(By.id("js")); // locate web element
((JavascriptExecutor) driver).executeScript("arguments[0].onclick=function(){alert('js has been execute!');}",ele); // add js on the web element
ele.click();
2)获取不到页面上input元素的值,解决方式:
解决方法:
JavascriptExecutor js = (JavascriptExecutor) driver;
String sheetNo =(String) js.executeScript("return document.getElementById('sheetNo').value");