前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Selenium WebDriver脚本Java代码示例

Selenium WebDriver脚本Java代码示例

作者头像
软测小生
发布于 2019-09-04 07:45:34
发布于 2019-09-04 07:45:34
5.4K00
代码可运行
举报
文章被收录于专栏:软测小生软测小生
运行总次数:0
代码可运行

本篇文章将介绍如下内容: WebDriver代码 Selenium定位UI元素 Selenium常用命令 Get命令 --Get Commands 导航(跳转)命令-Navigate commands Close和Quite关闭和退出浏览器窗口 切换内嵌框架Frame 切换到弹出框

创建一个WebDriver脚本,它将: 1、跳转到MercuryTours的主页(Demo页面); 2、验证其主页的标题(Title); 3、打印出比较的结果; 4、在结束整个程序之前关闭它。

WebDriver代码

以下是上面场景提供的逻辑实际WebDriver代码: 注意: 自从Firefox35开始,需要使用Mozilla创建的Gecko;Selenium 3.0、gecko和firefox存在兼容性问题,正确设置它们可能会成为一项艰巨的任务。如果代码不能工作,将其降级到Firefox47或更低版本。或者,你也可以在Chrome上运行你的脚本。Selenium在Chrome中开箱即用。你只需要改变3行代码,使你的脚本与Chrome或Firefox兼容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
    }
}

代码解读:

导入包 首先,您需要导入以下两个包:

  1. org.openqa.selenium.* --包含实例化加载了特定Driver的新浏览器所需的WebDriver类;
  2. org.openqa.selenium.firefox.FirefoxDriver --包含将特定于Firefox的driver实例化到WebDriver类实例化的浏览器所需的FirefoxDriver类;

如果您的测试需要更复杂的操作,比如访问另一个类、获取浏览器截图或操作外部文件,那么您肯定需要导入更多的包。

实例化对象和变量 通常,这是驱动程序(Driver)对象的实例化方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Firefox
WebDriver driver = new FirefoxDriver();
//Chrome
WebDriver driver = new ChromeDriver();

没有参数的FirefoxDriver类意味着我们的Java程序将启动默认的Firefox配置文件。默认Firefox配置文件类似于以安全模式启动Firefox(不加载扩展)。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.get(baseUrl);

获取实际的页面标题 WebDriver类具有getTitle() 方法,该方法总是用于获取当前加载页面的页面标题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
actualTitle = driver.getTitle();

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(actualTitle.contentEquals(expectedTitle)){
    System.out.print("Test Passed!");
} else {
    System.out.print("Test Failed!");
}

关闭浏览器会话 close()方法用于关闭浏览器窗口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    driver.close();

终止整个程序 如果你在没有先关闭所有浏览器窗口的情况下使用此命令,你的整个Java程序将在浏览器窗口打开时结束。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    System.exit(0)

运行测试Eclipse IDE中执行代码有两种方法。 1、在Eclipse的菜单栏上,单击Run > Run; 2、按Ctrl+F11运行整个代码。

按Ctrl+F11运行整个代码

如果所有操作都正确,Eclipse将输出“Test Passed!”

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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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() 方法提取 idemail的特定元素的标记名。运行时,这段代码应该能够正确识别标记名称input,并将其打印到Eclipse的控制台窗口,如下:

打印tag名称

定位元素摘要:

元素定位的8种方式

Selenium常用命令:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WebElement myElement = driver.findElement(By.id("username"));
myElement.sendKeys("tutorial");

单击元素

单击可能是与Web元素交互的最常见方式。Click()方法用于模拟元素的单击。下面的例子展示了如何使用Click()单击Mercury Tours主页的Sign-In按钮:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()部分的参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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控制台,注意打印的警告消息是:

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()WebDriverWaitExpectedConditions 方法的组合; 但这并不是验证元素是否存在,只是确定元素的一种状态。
  • 当元素不存在时调用isEnabled()、isdisplay()或isSelected(), WebDriver将抛出NoSuchElementException
  • 当元素不存在时调用WebDriverWaitExpectedConditions方法,WebDriver将抛出TimeoutException

注意: driver.get() : 它用于访问特定的网站,但它不维护浏览器历史记录和cookie,所以我们不能使用前进后退按钮;使用get()会跳转到一个新的页面,当有需要前进或后退到需要的页面获取元素时,无法再对历史页面来回跳转;

driver.navigate() : 它用于访问特定的网站,但是它维护浏览器历史记录和cookie,所以我们可以在编写Testcase的过程中使用前进和后退按钮在页面之间导航,进行需要的操作或者获取相应的信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软测小生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
号称在澳门100%赢钱的倍押法,真的可行吗?
最近比特币价格大跳水,多少炒币客爆仓,尤其是那些加了杠杆的更是倾家荡产。我就听说了身边一个因为借了巨额债务炒币血本无归最终自杀的case,这人刚结婚不久,老婆也才生了孩子,就发生了这样的悲剧,实在是令人唏嘘。
TechFlow-承志
2022/08/26
16.6K0
号称在澳门100%赢钱的倍押法,真的可行吗?
逢赌必赢的秘密
本文由CDA作者库成员麻赛原创,并授权发布 原文来自公众号麻大湿讲数据(ID:madashi_data)。 首先是麻大湿的老实交代 这篇文章标题党了,你不能学到逢赌必赢的秘密,要是真有这本事我还写公众
CDA数据分析师
2018/02/24
2.8K0
逢赌必赢的秘密
凯利公式(庄家必胜篇)——致放假在家的高薪程序员们
叶汉说的只是心理层面,现代赌场程序方面的设计比叶汉当年要缜密得多,赌场集中了概率学、统计学的数学知识。一个普通赌徒,只要长久赌下去,最终一定会血本无归。所谓的各种致胜绝技,除了《赌圣》电影里的周星星,现实世界里的周星驰都不信。
红目香薰
2022/11/29
1.2K0
凯利公式(庄家必胜篇)——致放假在家的高薪程序员们
仓位管理:超越凯利公式,梦回华尔街!
举个简单的例子,如果你有1万元资金,投资时间为5年,年化收益率为10%。五年后,你一共能拿回多少呢?按照上面的公式,结果就是:
量化投资与机器学习微信公众号
2019/08/20
1.9K0
深度:女版“乔布斯”覆灭记!硅谷美女CEO被曝百亿美元大骗局
你有没有想过,如果在 2019 年,你可以心想事成,那你的人生巅峰最好可以混成什么样子?
量子位
2019/04/24
7720
深度:女版“乔布斯”覆灭记!硅谷美女CEO被曝百亿美元大骗局
行业视角 | 大数据分析,不读书成功逆袭概率多少?
很多人想要快乐地生活下去,靠的是创造与重复假象不断地麻痹自己,这也正是绝大多数人传播读书无用论的根本动机。 无奈国内反智主义盛行的大环境侵犯到了每一个受过高等教育的人的切身利益,总得有人站出来发声。
加米谷大数据
2018/04/02
8130
行业视角 | 大数据分析,不读书成功逆袭概率多少?
一个程序员的十年(plus版) | Q推荐
这篇文章是一位程序员的成功转型故事,推荐给你。这篇文章我花了 30 天时间,修改了 10 次,用户给我写了 16000 多字的反馈。21 年的上半年只剩最后一个月了,写下这篇文章作为一份礼物,送给大家。可以说如果没有我人生中 3 次整夜失眠的经历,也没有那个从月薪 4000+ 到单月利润破 100 万的我。我想讲的是一个小人物,如何借助成长性思维,一次次战胜了自己的自卑与恐惧。 109 年大学毕业后,我人生中第一次失眠 大学毕业,我入职了一家国有银行的研发中心,在珠海,拿着 4000 元的月薪。 也是我第一
深度学习与Python
2023/04/01
2710
一个程序员的十年(plus版) | Q推荐
程序员的数学---数学思维的锻炼
来看一道简单的题目:今天星期日,那么 100 天以后星期几? 这个问题最笨的方法就是数数了。不过那样也是颇为费事,从余数方向考虑:一个礼拜 7 天,100 天等于 14 个礼拜周期还剩两天(100 = 14*7 + 2)。于是答案就是星期 2 了。
指点
2019/01/18
1.1K0
程序员的数学---数学思维的锻炼
《腾讯传》读书笔记
马化腾:腾讯公司控股董事会主席兼首席执行官  许晨晔:腾讯公司首席信息官  张志东:2014年3月19日卸任首席技术官(CTO)  陈一丹:2013年3月21日宣布卸任首席行政官(CAO)  曾李青:1999年-2007年期间担任腾讯公司首席运营官(COO),2007年6月离开腾讯后担任腾讯公司终身荣誉顾问,德讯投资创始人
meteoric
2018/11/19
3.5K0
每周分享第 16 期
影视作品经常出现,病人的心脏停止跳动,医生使用两块电极板对心脏电击。它叫除颤器(defibrillator),通过放电刺激心脏恢复跳动。
ruanyf
2018/08/09
7980
每周分享第 16 期
大疆创新成长史上不为人知的故事
---- 从2006年建立大疆,汪滔掌舵的大疆创新(简称DJI)默默无闻走过了大部分日子,没有过多包装,也没什么游说;汪滔自己还曾用“偏执”的股权分配,让公司濒临分崩离析。 汪滔不炒概念 汪滔甚至不喜欢别人在他面前过多提及时下火热的互联网概念。并非冥顽不化,而是在他看来,对一家科技公司而言,科研本身更为重要,而互联网仅仅只是个工具。 “套上互联网这层皮,感觉好像很高大上,但事情的本质还是掩盖不了;比如一件产品还是没办法将欧美变成核心市场,当它在中国卖饱和后,跑到一个更落后的地方,在一个
机器人网
2018/04/20
2K0
大疆创新成长史上不为人知的故事
货币战争(一)
前言 财富,也包括通货,都是人类劳动的成果。通货的商品属性,其实质乃是劳动属性 人们甚至忘记了美元仅仅是一种财富的收据,而绝非财富本身 人们在长期被洗脑的过程中已逐渐淡忘纸币收据背后的黄金,但黄金毕竟制约收据的超额增发,因为当收据过多时,迟早会激发人们对这些收据所能索取的黄金的兴趣。银行家们作为货币游戏规则的制定者,并不喜欢黄金作为纸币的抵押物,一是黄金不足以满足纸币膨胀的欲望,二是黄金不能产生利息收入 主权信用货币——一种以主权国家的债务为抵押资产来发行货币的尝试,纸币这一收据所能索取到的最终财富不再是黄
yeedomliu
2021/07/19
1.1K0
一段关于国产芯片和操作系统的往事
中兴事件引发一片网络热议。什么“这次被美国卡住的芯,一万年也要搞出来”、“中国芯老炮:缺芯是因为缺钱”“国产操作系统,要靠BAT”……这种言论看得我胸痛。
数字积木
2021/04/15
5770
「长文预警」云计算、人工智能、大数据到底是啥玩意?
我今天要讲这三个话题,一个是云计算,一个大数据,一个人工智能,我为什么要讲这三个东西呢?因为这三个东西现在非常非常的火,它们之间好像互相有关系,一般谈云计算的时候也会提到大数据,谈人工智能的时候也会提大数据,谈人工智能的时候也会提云计算。所以说感觉他们又相辅相成不可分割,如果是非技术的人员来讲可能比较难理解说这三个之间的相互关系,所以有必要解释一下。
用户1093975
2018/08/02
8120
「长文预警」云计算、人工智能、大数据到底是啥玩意?
深度 | 人工智能战胜顶级扑克玩家的背后,是 20 年来扑克机器人的不断进步
编者按:本文作者 Joshua Brustein,原载于Bloomberg,由AI科技评论编译。 四名世界上最好的职业扑克玩家一月份的大部分时间都猫在位于匹兹堡的大河赌场,品味着失败。他们会在上午11点前准时出现,身穿时髦的运动裤和有型的球鞋坐在电脑屏幕前。每个人在夜里回到宾馆房间前差不多要打1500手在线无限级德州扑克的1对1单挑。这通常意味着每天工作都会超过晚上10点。在这漫长的一天里,星巴克杯和水樽散乱堆放在玩家键盘旁,Chipotle墨西哥卷饼快餐包装袋散落在他们脚边。 每当一个人类玩家打出一手
AI科技评论
2018/03/09
7370
深度 | 人工智能战胜顶级扑克玩家的背后,是 20 年来扑克机器人的不断进步
计算与推断思维 九、经验分布
大部分数据科学都涉及来自大型随机样本的数据。 在本节中,我们将研究这些样本的一些属性。
ApacheCN_飞龙
2022/12/01
7460
计算与推断思维 九、经验分布
【正经说】如何签订合法有效的对赌协议的分析和方法(含案例)
对赌协议(Valuation Adjustment Mechanism,VAM),最初被翻译为“对赌协议”,或因符合国有文化很形象,一直沿用至今。但其直译意思是“估值调整机制”却更能体现其本质含义,所以我们日常听到的对赌协议,所涉及问题其实和赌博无关。实际上就是期权的一种形式。通过条款的设计,对赌协议可以有效保护投资人利益。在国外投行对国内企业的投资中,对赌协议已经应用。
辉哥
2018/08/10
2.3K0
论概率:从局部随机性到整体确定性
以两个随机事件为例,一个随机事件发生或者另一个随机事件发生的概率,也就是这两个随机事件发生其一的概率,等于两个随机事件各自发生概率的和。
全栈程序员站长
2022/09/02
1.5K0
论概率:从局部随机性到整体确定性
云计算与人工智能
来自:cnblogs.com/popsuper1982/p/8505203.html 我今天要讲这三个话题,一个是云计算,一个大数据,一个人工智能,我为什么要讲这三个东西呢?因为这三个东西现在非常非常的火,它们之间好像互相有关系,一般谈云计算的时候也会提到大数据,谈人工智能的时候也会提大数据,谈人工智能的时候也会提云计算。所以说感觉他们又相辅相成不可分割,如果是非技术的人员来讲可能比较难理解说这三个之间的相互关系,所以有必要解释一下。 一、云计算最初是实现资源管理的灵活性 我们首先来说云计算,云计算最初的目
架构师小秘圈
2018/04/02
4.9K0
云计算与人工智能
Google勇敢新世界:两个天才的相遇
谢尔盖·布林(Sergey Brin)也许永远不会忘记1979年,那一年他刚好5岁,由于前苏联对犹太人实行歧视政策,他们全家移民到美国,在这片大陆上开始了新的生活,那也标志着美国历史上最后一次移民潮的终结。
爱明依
2019/03/12
6230
推荐阅读
相关推荐
号称在澳门100%赢钱的倍押法,真的可行吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验