Selenium Webdriver 学习笔记

Selenium

Selenium 是一个用于Web应用程序测试的工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Firefox,Safari,Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

Selenium 和 webdriver的区别

WebDriver 和 Selenium 本是两个独立的项目,实现机制也是不同的,早期 selenium 主要支持的是 Firefox,通过火狐的插件来实现功能。而 webdriver 则针对许多主流浏览器开发,取代了把js嵌入到web应用的这种测试方法,selenium 官网是这么介绍的 “selenium 1.0 + webdriver = selenium 2.0”

Selenium 诞生于 2004 年,当在 ThoughtWorks 工作的 Jason Huggins
在测试一个内部应用时。作为一个聪明的家伙,他意识到相对于每次改动都需要手工进行测试,他的时间应该用得更有价值。他开发了一个可以驱动页面进行交互的
Javascript 库,能让多浏览器自动返回测试结果。那个库最终变成了 Selenium 的核心,它是 Selenium
RC(远程控制)和 Selenium IDE 所有功能的基础。Selenium RC
是开拓性的,因为没有其他产品能让你使用自己喜欢的语言来控制浏览器。这就是 Selenium 1。

然而,由于它使用了基于 Javascript 的自动化引擎,而浏览器对 Javascript
又有很多安全限制,有些事情就难以实现。更糟糕的是,网站应用正变得越来越强大,它们使用了新浏览器提供的各种特性,都使得这些限制让人痛苦不堪。

在 2006 年,一名 Google 的工程师, Simon Stewart 开始基于这个项目进行开发,这个项目被命名为
WebDriver。此时,Google 早已是 Selenium 的重度用户,但是测试工程师们不得不绕过它的限制进行工具。Simon
需要一款能通过浏览器和操作系统的本地方法直接和浏览器进行通话的测试工具,来解决Javascript 环境沙箱的问题。WebDriver
项目的目标就是要解决 Selenium 的痛点。

到了 2008 年,Selenium 和 WebDriver 两个项目合并。Selenium 有着丰富的社区和商业支持,但
WebDriver 显然代表着未来的趋势。两者的合并为所有用户提供了一组通用功能,并且借鉴了一些测试自动化领域最闪光的思想。这就是
Selenium 2。

2016 年,Selenium 3 诞生。移除了不再使用的 Selenium 1 中的 Selenium
RC,并且官方重写了所有的浏览器驱动。摘自此处

如何使用

https://docs.seleniumhq.org/download/ (可以下载各种语言的webdriver依赖库)

https://github.com/mozilla/geckodriver/releases/ (Firefox的webdriver驱动)

http://chromedriver.storage.googleapis.com/index.html (chrome的webdriver)

firefox

因为我的火狐版本是最新的63,所以这里需要用到针对selenium2开发的geckodriver。
我的环境:webdriver依赖版本= 3.5.3 Firefox版本=63.0.3 geckodriver=0.23

public static void main(String[] args) throws InterruptedException {
    System.setProperty("webdriver.gecko.driver","C:\\Users\\xxx\\Downloads\\geckodriver-v0.23.0-win64\\geckodriver.exe");
    FirefoxOptions options = new FirefoxOptions();
    options.setBinary("D:\\Software\\Firefox\\firefox.exe");
    FirefoxDriver driver = new FirefoxDriver(options);
    driver.get("http://www.baidu.com");
    Thread.sleep(1000);
    driver.executeScript("$(\"#kw\").val('长得太帅怎么办')");
}

4.gif

chrome

public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver","G:\\temp\\chromedriver_win32\\chromedriver72.0.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("http://baidu.com");
    }

chrome之需要指定一个chrome驱动的变量就行,驱动的版本不能小于已安装的版本。

我的环境:webdriver依赖版本= 3.5.3 chrome版本=70 chromedriver=72.0

remote

webdriver还支持调用接口的方式来操作浏览器。
这里要去官网下载一个selenium-server,直接执行jar包,就会启动一个webdriver接口服务(没有把驱动配置到系统变量时需要在参数中加上 -D[变量名]=[变量值])。

1545213410(1).jpg

启动后默认开启4444端口,所以在创建webdriver对象时填写接口地址:http://127.0.0.1:4444/wd/hub/

public static void main(String[] args) throws MalformedURLException {
        WebDriver driver = new RemoteWebDriver(
                new URL("http://127.0.0.1:4444/wd/hub/"),
                DesiredCapabilities.chrome());
        driver.manage().window().maximize();
        driver.get("http://www.baidu.com");
    }

执行后就会在服务器端启动一个chrome浏览器并访问http://baidu.com

webdriver API

查找单个页面元素(findElement)

id : WebElement element = driver.findElement(By.id("passwd-id"));

Name : WebElement element = driver.findElement(By.name("passwd"));

XPATH : WebElement element =driver.findElement(By.xpath("//input[@id='passwd-id']"));

查找多个元素 (findElements)

List<WebElement>cheeses = driver.findElements(By.className("test"));

操作页面元素

在输入框中输入内容:element.sendKeys(“test”);

将输入框清空:element.clear();

获取输入框的文本内容:element.getText();

找到下拉选择框的元素:Select select = new Select(driver.findElement(By.id("select")));

选择对应的选择项:select.selectByVisibleText("xxx"); select.selectByValue("xxx");

不选择对应的选择项:select.deselectAll(); select.deselectByValue("xxx"); select.deselectByVisibleText("xx");

或者获取选择项的值:select.getAllSelectedOptions(); select.getFirstSelectedOption();

选择某个单选项:bookMode.click();

清空某个单选项:bookMode.clear();

判断某个单选项是否已经被选择:bookMode.isSelected();

多选项的操作和单选的差不多:
checkbox.click();

checkbox.clear();

checkbox.isSelected();

checkbox.isEnabled();

点击按钮:saveButton.click();

对话框:Alert alert = driver.switchTo().alert();

确定:alert.accept();

取消:alert.dismiss();

对话框文本:alert.getText();

上传文件的元素操作:

String filePath = "/root/1.txt";
adFileUpload.sendKeys(filePath);

Windows 和 Frames之间的切换
一般来说,登录后建议是先:driver.switchTo().defaultContent();

切换到某个frame:driver.switchTo().frame("leftFrame");

从一个frame切换到另一个frame:driver.switchTo().frame("mainFrame");

切换到某个window:driver.switchTo().window("windowName");

拖拽:(new Actions(driver)).dragAndDrop(element, target).perform();

打开一个新的页面:driver.navigate().to("http://www.example.com");

通过历史导航返回原页面:
driver.navigate().forward();

driver.navigate().back();

执行JS:JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("alert(1)");

截图:driver.getScreenshotAs(OutputType.FILE);

获取源码:getPageSource()

参考

https://seleniumhq.github.io/selenium/docs/api/java/
https://www.cnblogs.com/cangqiongbingchen/p/4739121.html
https://blog.csdn.net/TestingGDR/article/details/81950593

发表留言

如未标注转载则文章均为本人原创,转载前先吱声,未授权转载我就锤爆你狗头。

人生在世,错别字在所难免,无需纠正。