问题: selenium启动firefox的时候,会使用一个全新的profile作为启动的profile,即手工在firefox中的设置都无法使用。
解决: 找到手动启动firefox时的profile目录,测试程序中通过FirefoxProfile传递给WebDriver
1. 查看profile目录
命令行方式,进入firefox安装目录(多为: C:\Program Files (x86)\Mozilla Firefox),执行
firefox.ext -P
或
firefox.exe -ProfileManager
弹出profile管理画面,鼠标移到profile名上,会显示其路径
也可新建profile目录,从此对话框启动该profile的firefox,设置信任网站
2. 测试程序:
1 @Test 2 public void test() { 3 System.setProperty("webdriver.gecko.driver", "E:/selenium/geckodriver.exe"); 4 5 //指向firefox的profile目录 6 FirefoxProfile profile = new FirefoxProfile(new File("C:/Users/me/AppData/Roaming/Mozilla/Firefox/Profiles/mmi7kyn4.default")); 7 profile.setAcceptUntrustedCertificates(true); 8 9 //使用指定profile启动 10 WebDriver driver = new FirefoxDriver(profile); 11 driver.get("https://www.abcd.com"); 12 13 //输入用户名,密码,并提交 14 WebElement userId = driver.findElement(By.cssSelector("input[name=‘userId‘]")); 15 userId.sendKeys("username"); 16 WebElement password = driver.findElement(By.cssSelector("input[name=‘password‘]")); 17 password.sendKeys("pasword"); 18 19 WebElement submit = driver.findElement(By.cssSelector("button")); 20 submit.click(); 21 22 //稍微等待应答 23 try { 24 Thread.sleep(3000); 25 } catch (InterruptedException e) { 26 e.printStackTrace(); 27 } 28 29 Assert.assertEquals("XXX", driver.getTitle()); 30 driver.quit(); 31 }
关于延时等待的几个方法:
1) Thread.sleep() , 最笨的方法,但有时也很实用
2) 隐示等待,指当要查找元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。
WebDriver dr = new FirefoxDriver();
dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
3) 使用javascript
WebElement element = driver.findElement(By.xpath(test));
((JavascriptExecutor)driver).executeScript("arguments[0].style.border="5px solid yellow"",element);
4) 显示等待,推荐使用。
WebDriverWait wait = new WebDriverWait(dr, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw")));
显式等待可以自定义等待的条件,用于更加复杂的页面等待条件
(1)元素可用和可被单击:elementToBeClickable(By locator)
(2)元素处于被选中状态:elementToBeSelected(WebElement element)
(3)元素存在:presenceOfElementLocated(By locator)
(4)元素中包含特定的文本:textToBePresentInElement(By locator)
(5)页面元素值:textToBePresentInElementValue(By locator, java.lang.String text)
(6)标题 (title):titleContains(java.lang.String title)
参考地址:
http://www.cnblogs.com/lelelong/p/5523444.html
http://blog.sina.com.cn/s/blog_71bc9d680102wr4o.html