本篇文章将介绍如下内容:
使用我们在前一个教程中创建的Java类“MyClass”,让我们尝试创建一个WebDriver脚本,它将:
1、跳转到MercuryTours的主页(Demo页面);
2、验证其主页的标题(Title);
3、打印出比较的结果;
4、在结束整个程序之前关闭它。
WebDriver代码
以下是上面场景提供的逻辑实际WebDriver代码:
注意: 自从Firefox 35开始,需要使用Mozilla创建的Gecko;Selenium 3.0、gecko和firefox存在兼容性问题,正确设置它们可能会成为一项艰巨的任务。如果代码不能工作,将其降级到Firefox47或更低版本。或者,你也可以在Chrome上运行你的脚本。Selenium在Chrome中开箱即用。你只需要改变3行代码,使你的脚本与Chrome或Firefox兼容:
package newpackage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
//注释上面的行和取消注释下面的行来使用Chrome
//import org.openqa.selenium.chrome.ChromeDriver;
public class PG1 {
public static void main(String[] args) {
// 对象/变量的声明和实例化
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
//注释以上两行代码,取消下面两行代码的注释,以使用Chrome
//System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");
//WebDriver driver = new ChromeDriver();
String baseUrl = "http://demo.guru99.com/test/newtours/";
String expectedTitle = "Welcome: Mercury Tours";
String actualTitle = "";
// 启动Fire fox并将其指向基本URL
driver.get(baseUrl);
// 获取标题的实际值
actualTitle = driver.getTitle();
/*
* 将页面的实际标题与预期标题进行比较并打印
* 结果为“Passed”或“Failed”
*/
if (actualTitle.contentEquals(expectedTitle)){
System.out.println("Test Passed!");
} else {
System.out.println("Test Failed");
}
//关闭浏览器
driver.close();
}
}
代码解读:
导入包
首先,您需要导入以下两个包:
- org.openqa.selenium.* --包含实例化加载了特定Driver的新浏览器所需的WebDriver类;
- org.openqa.selenium.firefox.FirefoxDriver --包含将特定于Firefox的driver实例化到WebDriver类实例化的浏览器所需的FirefoxDriver类;
如果您的测试需要更复杂的操作,比如访问另一个类、获取浏览器截图或操作外部文件,那么您肯定需要导入更多的包。
实例化对象和变量
通常,这是驱动程序(Driver)对象的实例化方式:
//Firefox
WebDriver driver = new FirefoxDriver();
//Chrome
WebDriver driver = new ChromeDriver();
没有参数的FirefoxDriver类意味着我们的Java程序将启动默认的Firefox配置文件。默认Firefox配置文件类似于以安全模式启动Firefox(不加载扩展)。
为了方便起见,我们将基本URL和期望的标题保存为变量。
启动浏览器会话
WebDriver的get() 方法用于启动一个新的浏览器会话,并将其定向到作为参数指定的URL。
driver.get(baseUrl);
获取实际的页面标题
WebDriver类具有getTitle() 方法,该方法总是用于获取当前加载页面的页面标题。
actualTitle = driver.getTitle();
比较预期值和实际值
这部分代码只是使用一个基本的Java if-else 结构来比较实际标题和预期标题:
if(actualTitle.contentEquals(expectedTitle)){
System.out.print("Test Passed!");
} else {
System.out.print("Test Failed!");
}
关闭浏览器会话
close()方法用于关闭浏览器窗口。
driver.close();
终止整个程序
如果你在没有先关闭所有浏览器窗口的情况下使用此命令,你的整个Java程序将在浏览器窗口打开时结束。
System.exit(0)
运行测试
在Eclipse IDE中执行代码有两种方法。
1、在Eclipse的菜单栏上,单击Run > Run;
2、按Ctrl+F11运行整个代码。
如果所有操作都正确,Eclipse将输出“Test Passed!”
Selenium定位UI元素
在WebDriver中定位元素是通过使用"findElement(by.locator()"方法来完成的。
以下是在WebDriver中定位元素的可用选项:
- By.className
- By.cssSelector
- By.id
- By.linkText
- By.name
- By.partialLinkText
- By.tagName
- By.xpath
下面是根据id定位元素的示例代码。Facebook用作基本URL:
package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class PG2 {
public static void main(String[] args) {
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
String baseUrl = "http://www.facebook.com";
String tagName = "";
driver.get(baseUrl);
tagName = driver.findElement(By.id("email")).getTagName();
System.out.println(tagName);
driver.close();
System.exit(0);
}
}
我们使用getTagName() 方法提取 id为email的特定元素的标记名。运行时,这段代码应该能够正确识别标记名称input,并将其打印到Eclipse的控制台窗口,如下:
定位元素摘要:
Selenium常用命令:
实例化Web元素
在每次访问特定元素时,我们可以为它实例化一个WebElement对象,而不是使用冗长的driver.findElement(By.locator() 语法。
WebElement类包含在org.openqa.selenium.* 包中。
WebElement myElement = driver.findElement(By.id("username"));
myElement.sendKeys("tutorial");
单击元素
单击可能是与Web元素交互的最常见方式。Click()方法用于模拟元素的单击。下面的例子展示了如何使用Click()单击Mercury Tours主页的Sign-In按钮:
driver.findElement(By.name("login")).click();
使用**click()**方法时必须注意以下事项:
- 它不接受任何参数;
- 如果适用,该方法将自动等待加载新页面;
- 要选中的元素必须是可见的(高度和宽度不能等于零)。
.
.
Get命令 --Get Commands
Get命令获取关于页面/元素的各种重要信息。下面是一些您必须熟悉的重要get命令。
- get()
- getTitle()
- getPageSource()
- getCurrentUrl()
- getText()
1、 get(url) 示例用法:
- 它会自动打开一个新的浏览器窗口,并跳转到括号内指定的url页面。
- 参数必须是字符串对象。
2、getTitle() 示例用法:
- 不需要参数
- 获取当前页的标题
- 去掉title字符串前后的空白
- 如果页面没有标题,则返回空字符串
3、getPageSource() 示例用法:
- 不需要参数
- 以字符串值的形式返回页面的源代码
4、getCurrentUrl() 示例用法:
- 不需要参数
- 获取浏览器当前URL
5、getText() 示例用法:
- 获取指定元素的内部文本
导航(跳转)命令-Navigate commands
这些命令允许您刷新、进入和在不同的Web页面之间来回切换。
- navigate().forward()
- navigate().back()
- navigate().to()
- navigate().refresh()
1、navigate().to() 示例用法:
- 它会自动打开一个新的浏览器窗口,并跳转到括号内指定的url页面;
- 它的作用与get()方法完全相同。
2、navigate().refresh() 示例用法:
- 不需要参数
- 刷新当前页面
3、navigate().back() 示例用法:
- 不需要参数
- 返回上一个历史页面
4、navigate().forward() 示例用法:
- 不需要参数
- 进入下一个历史页面
Close和Quite关闭和退出浏览器窗口
1、 close() 示例用法:
- 不需要参数
- 它只关闭WebDriver控制的当前浏览器窗口;关闭单个浏览器窗口
2、quite() 示例用法:
- 不需要参数
- 使用quit()关闭与WebDriver对象所控制的父窗口关联的所有窗口。
切换内嵌框架Frame
要访问框架中的GUI元素,我们应该首先引导WebDriver将焦点放在框架或弹出窗口上,然后才能访问其中的元素。让我们以web页面http://demo.guru99.com/selenium/deprecated.html:
这个页面有3个框架,上面显示了它们的name属性。我们希望访问上面黄色包围的“Deprecated”链接。为了做到这一点,我们必须首先命令WebDriver使用switchTo().frame() 方法切换到classFrame 框架。我们将使用框架的name属性作为frame()部分的参数。
package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class PG4 {
public static void main(String[] args) {
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://demo.guru99.com/selenium/deprecated.html");
driver.switchTo().frame("classFrame");
driver.findElement(By.linkText("Deprecated")).click();
driver.close();
}
}
执行此代码后,您将看到classFrame框架被切换到Deprecated API页面,这意味着我们的代码成功地访问了Deprecated链接。
切换到弹出框
WebDriver允许显示诸如警告之类的弹出窗口。要访问警报中的元素(比如它包含的消息),必须使用switchTo().alert() 方法。
在下面的代码中,我们将使用此方法访问警报框,然后使用getText() 方法检索其消息,然后使用switchTo().alert().accept() 方法自动关闭警报框。
首先,跳转到http://jsbin.com/usidix/1,手动单击那里的Go! 按钮,看到如下:
WebDriver代码如下:
package mypackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class myclass {
public static void main(String[] args) {
System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
String alertMessage = "";
driver.get("http://jsbin.com/usidix/1");
driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click();
alertMessage = driver.switchTo().alert().getText();
driver.switchTo().alert().accept();
System.out.println(alertMessage);
driver.quit();
}
}
在Eclipse控制台,注意打印的警告消息是:
总结:
- 要开始使用WebDriver API,您必须至少导入这两个包。
- org.openqa.selenium.*
- org.openqa.selenium.firefox.FirefoxDriver
- 在WebDriver中定位元素是使用findElement() 方法完成的。
- switchTo().frame() 和switchTo().alert() 方法分别用于将WebDriver的焦点切换到框架或警报弹窗上。
- 隐式等待(Implicit waits) 用于整个页面中设置等待时间;而显式等待(explicit waits) 仅用于等待特定的部分。
- 在验证元素的状态时,可以使用isEnabled()、isdisplay()、isSelected() 和WebDriverWait 和ExpectedConditions 方法的组合;
但这并不是验证元素是否存在,只是确定元素的一种状态。 - 当元素不存在时调用isEnabled()、isdisplay()或isSelected(), WebDriver将抛出NoSuchElementException。
- 当元素不存在时调用WebDriverWait和ExpectedConditions方法,WebDriver将抛出TimeoutException。
注意:
driver.get() :
它用于访问特定的网站,但它不维护浏览器历史记录和cookie,所以我们不能使用前进和后退按钮;使用get()会跳转到一个新的页面,当有需要前进或后退到需要的页面获取元素时,无法再对历史页面来回跳转;
driver.navigate() :
它用于访问特定的网站,但是它维护浏览器历史记录和cookie,所以我们可以在编写Testcase的过程中使用前进和后退按钮在页面之间导航,进行需要的操作或者获取相应的信息。