添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Selenium Java 例如:

使用 Java 利用我们在上一个教程中创建的类“myclass”,让我们尝试创建一个 WebDriver 脚本,该脚本将:

步骤1: 取 Mercury 旅游主页
步骤2: 核实其标题
步骤3: 打印出比较结果
步骤4: 在结束整个程序之前将其关闭。

Selenium WebDriver 示例代码

以下是上述场景所呈现的逻辑的实际 WebDriver 代码

package newproject;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
//comment the above line and uncomment below line to use Chrome
//import org.openqa.selenium.chrome.ChromeDriver;
public class PG1 {
    public static void main(String[] args) {
        // declaration and instantiation of objects/variables
    	System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe");
		WebDriver driver = new FirefoxDriver();
		//comment the above 2 lines and uncomment below 2 lines to use 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 = "";
        // launch Fire fox and direct it to the Base URL
        driver.get(baseUrl);
        // get the actual value of the title
        actualTitle = driver.getTitle();
         * compare the actual title of the page with the expected one and print
         * the result as "Passed" or "Failed"
        if (actualTitle.contentEquals(expectedTitle)){
            System.out.println("Test Passed!");
        } else {
            System.out.println("Test Failed");
        //close Fire fox
        driver.close();

注意:开始 Firefox 35,您需要使用 Mozilla 创建的 gecko 驱动程序才能使用 Web Driver。 Selenium 3.0,gecko 和 Firefox 存在兼容性问题,正确设置它们可能是一项艰巨的任务。如果代码不起作用,请降级到 Firefox 版本 47 或更低版本。或者,您也可以在 Chrome 上运行脚本。 Selenium Chrome 开箱即用。你只需要更改 3 行代码即可使你的脚本与 Chrome 兼容,或者 Firefox

  • org.openqa.selenium.*– 包含实例化加载特定驱动程序的新浏览器所需的 WebDriver 类
  • org.openqa.selenium.firefox。Firefox驱动器 – 包含 Firefox需要实例化驱动程序类 Firefox特定驱动程序到由 WebDriver 类实例化的浏览器上
  • 如果您的测试需要更复杂的操作,例如访问另一个类、截取浏览器屏幕截图或操作外部文件,那么您肯定需要导入更多包。

    实例化对象和变量

    通常情况下,这就是驱动程序对象实例化的方式。

    WebDriver driver = new FirefoxDriver();

    A Firefox没有参数的驱动类意味着默认 Firefox 个人资料将由我们的 Java 程序。默认 Firefox 配置文件类似于启动 Firefox 处于安全模式(未加载任何扩展)。

    为了方便起见,我们将基本 URL 和预期标题保存为变量。

    启动浏览器会话

    WebDriver 的 得到() 方法用于启动新的浏览器会话并将其定向到您指定为其参数的 URL。

    driver.get(baseUrl);

    获取实际的页面标题

    WebDriver 类具有 获取标题() 始终用于获取当前加载页面的页面标题的方法。

    actualTitle = driver.getTitle();

    比较预期值和实际值

    这部分代码只是使用了一个基本的 Java if-else 结构来比较实际标题与预期标题。

    if (actualTitle.contentEquals(expectedTitle)){
                System.out.println("Test Passed!");
            } else {
                System.out.println("Test Failed");
    

    终止浏览器会话

    “”关()”方法用于关闭浏览器窗口。

    driver.close();

    终止整个程序

    如果您使用此命令时没有先关闭所有浏览器窗口,您的整个 Java 程序将结束,但浏览器窗口保持打开状态。

    System.exit(0);

    有两种方式可以执行代码 Eclipse IDE。

  • On Eclipse菜单栏中,点击 运行 > 运行。
  • 媒体 Ctrl + F11键 运行整个代码。
  • 如果你做的一切都正确, Eclipse 将输出“测试通过!”

    定位 GUI 元素

    在 WebDriver 中定位元素是通过使用“查找元素(通过。定位器())”方法。代码的“定位器”部分与之前讨论过的任何定位器相同 Selenium IDE 这些教程的章节。事实上,建议您使用 IDE 定位 GUI 元素,一旦成功识别,就将代码导出到 WebDriver。

    这里是一个 Selenium 通过元素的 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.gecko.driver","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);
    

    我们所使用的 获取标签名() 方法提取 ID 为“email”的特定元素的标签名称。运行时,此代码应该能够正确识别标签名称“input”,并将其打印出来 Eclipse的控制台窗口。

    定位元素摘要

    使用 findElement(By.cssSelector()) 的注意事项

    By.cssSelector() 不支持“包含”功能。考虑 Selenium 下面的 IDE 代码 –

    In Selenium IDE 中,整个测试通过。然而在 Selenium 下面的 WebDriver 脚本,相同的测试产生了错误,因为 WebDriver 在 By.cssSelector() 方法中使用时不支持“contains”关键字。

    实例化 Web 元素

    每次访问特定元素时,我们无需使用冗长的“driver.findElement(By.locator())”语法,而是可以为其实例化 WebElement 对象。WebElement 类包含在“org.openqa.selenium.*”包中。

    点击可能是与网络元素交互的最常见方式。 click() 方法用于模拟单击任意元素。以下 Selenium Java 这个例子显示了 click() 被用来点击 Mercury 旅游的“登录”按钮。

    使用click()方法时必须注意以下几点。

  • 它不接受任何参数/论据。
  • 如果适用,该方法将自动等待新页面加载。
  • 被点击的元素必须可见(高度和宽度不能等于零)。
  • 获取命令可获取有关页面/元素的各种重要信息。以下是您必须熟悉的一些重要“获取”命令。

    为了清楚地说明 close()quit(),尝试执行下面的代码。它使用一个网页,该网页在页面加载时自动弹出一个窗口,退出后打开另一个窗口。

    请注意,只有父浏览器窗口被关闭,而不是两个弹出窗口。

    但是如果你使用 quit(),所有窗口都会关闭——而不仅仅是父窗口。尝试运行下面的代码,你会注意到上面的两个弹出窗口也会自动关闭。

    package newproject;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    public class PG3 {
        public static void main(String[] args) {
        	System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe");
        	WebDriver driver = new FirefoxDriver();
            driver.get("http://www.popuptest.com/popuptest2.html");
            driver.quit();  // using QUIT all windows will close
    

    在框架之间切换

    要访问框架中的 GUI 元素,我们首先应指示 WebDriver 先将焦点放在框架或弹出窗口上,然后才能访问其中的元素。让我们以网页为例 http://demo.guru99.com/selenium/deprecated.html

    此页面有 3 个框架,其“name”属性如上所示。我们希望访问上面用黄色圈出的“已弃用”链接。为此,我们必须首先指示 WebDriver 使用 “switchTo().frame()” 方法。我们将使用框架的名称属性作为“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.gecko.driver","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”链接。

    在弹出窗口之间切换 Windows

    WebDriver 允许显示类似警报的弹出窗口,与 Selenium IDE。要访问警报内的元素(例如它包含的消息),我们必须使用 "switchTo().alert()" 方法。在下面的代码中,我们将使用此方法访问警告框,然后使用 "getText()" 方法,然后使用 "switchTo().alert().accept()" 方法。

    首先,前往 https://output.jsbin.com/usidix/1 然后手动点击那里的“Go!”按钮,亲自查看消息文本。

    让我们看看 Selenium 执行此操作的示例代码-

    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.gecko.driver","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 控制台,注意打印的警告信息是:

    有两种等待。

  • 隐式等待——用于设置整个程序的默认等待时间
  • 显式等待 – 用于仅设置特定实例的等待时间
  • 与显式等待相比,其编码更简单。
  • 它通常在代码的实例部分声明。
  • 您只需要导入一个额外的包。
  • 要开始使用隐式等待,您必须将此包导入到您的代码中。

    然后在代码的实例化部分添加以下内容。

    使用 WebDriverWait 和 ExpectedCondition 类进行显式等待. 对于以下 Selenium WebDriver 示例,我们将等待最多 10 秒钟,让 id 为“username”的元素变为可见,然后再继续执行下一个命令。步骤如下。

    导入这两个包:

    声明一个 WebDriverWait 变量。在此示例中,我们将使用“myWaitVar”作为变量的名称。

    在需要显式等待的部分使用 myWaitVar 和 ExpectedConditions。在本例中,我们将在“用户名”上使用显式等待(Mercury 我们可以在输入框中输入“教程”一词,然后输入“旅游主页”

    在条件和循环运算中使用以下方法 -

  • 已启用() 当您想要在执行命令之前验证某个元素是否启用时使用。
  • 是否显示() 当你想在执行命令之前验证某个元素是否显示时使用。
  • 被选中() 用于验证某个 复选框、单选按钮或下拉框中的选项 已选定。 它对其他元素不起作用。
  • 使用 ExpectedConditions

    ExpectedConditions 类提供了更广泛的条件,您可以将其与 WebDriverWait 的 till() 方法结合使用。

    以下是一些最常见的 ExpectedConditions 方法。

  • 警报是否存在() – 等待直到显示警告框。
  • 可点击元素() – 等待元素可见,同时启用。示例 Selenium 下面的代码将等待 id=”username” 的元素变为可见并启用,然后将该元素分配为名为“txtUserName”的 WebElement 变量。
  • 帧可用并切换到它() – 等待直到给定的帧可用,然后自动切换到它。
  • 使用 isEnabled()、isDisplayed() 和 isSelected() 时,WebDriver 假定该元素已存在于页面上。否则,它将抛出 没有这样的元素异常为了避免这种情况,我们应该使用try-catch块,这样程序就不会被中断。

    WebElement txtbox_username = driver.findElement(By.id("username"));
            if(txtbox_username.isEnabled()){
                txtbox_username.sendKeys("tutorial");
    catch(NoSuchElementException nsee){
                System.out.println(nsee.toString());
    

    如果您使用显式等待,那么您应该捕获的异常类型是“TimeoutException”。

  • 要开始使用 WebDriver API,您必须至少导入这两个包。
  • org.openqa.selenium.*
  • org.openqa.selenium.firefox。Firefox驱动器
  • 这款 get() 方法相当于 Selenium IDE 的“打开”命令。
  • 在 WebDriver 中定位元素是通过使用 findElement() 方法。
  • 以下是在 WebDriver 中定位元素的可用选项:
  • 按.className
  • 通过.cssSelector
  • 獲得.id
  • 通过.linkText
  • 通过.partialLinkText
  • 按标签名称
  • 通过.xpath
  • By.cssSelector() 才不是 支持 “包含” 功能。
  • 您可以使用 WebElement 类实例化一个元素。
  • 点击元素是通过使用 click() 方法。
  • WebDriver 提供了这些有用的获取命令:
  • 获取标题()
  • 获取页面源()
  • 获取当前网址()
  • getText()
  • WebDriver 提供了这些有用的导航命令
  • 导航()。前进()
  • 导航()。返回()
  • 导航()。刷新()
  • close() 和 quit() 方法用于关闭浏览器窗口。 Close() 用于关闭单个窗口;而 quit() 用于关闭与 WebDriver 对象控制的父窗口相关联的所有窗口。
  • 这款 switchTo().frame()switchTo().alert() 方法分别用于将 WebDriver 的焦点引导到框架或警报上。
  • Implicit waits 用于设置整个程序的等待时间,而 explicit waits 仅用于特定部分。
  • 您可以使用 isEnabled()、isDisplayed()、isSelected() 以及以下组合 网络驱动程序等待预期条件 方法可以验证元素的状态。但是,如果元素不存在,它们不会进行验证。
  • 当元素不存在时调用 isEnabled()、isDisplayed() 或 isSelected() 时,WebDriver 将抛出 没有这样的元素异常.
  • 当元素不存在时调用 WebDriverWait 和 ExpectedConditions 方法时,WebDriver 会抛出 TimeoutException.
  • driver.get():它用于访问特定的网站,但它不维护浏览器历史记录和 cookie,因此,我们不能使用前进和后退按钮,如果我们点击它,页面将不会获取时间表

    driver.navigate():它用于访问特定的网站,但它保留了浏览器历史记录和 cookie,因此我们可以在编写 Testcase 代码时使用前进和后退按钮在页面之间导航