WebDriver API (2)

神的宠儿yu 2024-07-19 14:03:03 阅读 62

本文将继续上文对WebDriver API的功能使用进行介绍。

一、浏览器操作

1. 浏览器前进forward与后退back

浏览器前进操作是指导航到前一个页面,在浏览器的历史记录中向前移动一页。

浏览器后退操作是指导航到前一个页面,在浏览器的历史记录中向后移动一页。

示例代码:

<code>import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

public class BrowserNavigation {

public static void main(String[] args) {

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

// 初始化WebDriver

WebDriver driver = new ChromeDriver();

// 打开第一个网页

driver.get("https://www.example.com");

// 打开第二个网页

driver.get("https://www.google.com");

// 执行后退操作,返回到第一个网页

driver.navigate().back();

// 执行前进操作,返回到第二个网页

driver.navigate().forward();

// 关闭浏览器

driver.quit();

}

}

2. 操作滚动条

操作滚动条通常使用JavaScript执行,因为Selenium WebDriver没有直接的方法来操作滚动条。以下是滚动到页面底部、滚动到特定元素和滚动到页面顶部的示例。

示例代码:

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.By;

public class ScrollExample {

public static void main(String[] args) {

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

// 初始化WebDriver

WebDriver driver = new ChromeDriver();

// 打开一个网页

driver.get("https://www.example.com");

// 创建一个JavaScript执行器

JavascriptExecutor js = (JavascriptExecutor) driver;

// 滚动到页面底部

js.executeScript("window.scrollTo(0, document.body.scrollHeight);");

// 滚动到特定元素

WebElement element = driver.findElement(By.id("someElementId"));

js.executeScript("arguments[0].scrollIntoView(true);", element);

// 滚动到页面顶部

js.executeScript("window.scrollTo(0, 0);");

// 关闭浏览器

driver.quit();

}

}

解释

滚动条

window.scrollTo(0, document.body.scrollHeight);:滚动到页面底部。arguments[0].scrollIntoView(true);:滚动到指定元素的位置。window.scrollTo(0, 0);:滚动到页面顶部。

二、sendKey模拟按键操作

在Selenium WebDriver中,sendKeys 方法不仅可以用于输入文本,还可以用于模拟按键操作。Selenium 提供了一个 Keys 枚举类,其中包含了许多常见的键,如箭头键、功能键、回车键等。

常见按键及其对应的 Keys 枚举值

按键 Keys 枚举值
回车键 Keys.ENTER
空格键 Keys.SPACE
退格键 Keys.BACK_SPACE
删除键 Keys.DELETE
选项键 Keys.ALT
控制键 Keys.CONTROL
转移键 Keys.SHIFT
箭头上键 Keys.ARROW_UP
箭头下键 Keys.ARROW_DOWN
箭头左键 Keys.ARROW_LEFT
箭头右键 Keys.ARROW_RIGHT
Tab 键 Keys.TAB
ESC 键 Keys.ESCAPE
F1-F12 键 Keys.F1Keys.F12

示例代码

以下是一些使用 sendKeys 方法来调用按键的示例:

1. 输入文本并按回车键

WebElement searchBox = driver.findElement(By.name("q"));

searchBox.sendKeys("Selenium WebDriver"); searchBox.sendKeys(Keys.ENTER);

作用:向名为 "q" 的输入框输入 "Selenium WebDriver" 后,模拟按下回车键。

2. 使用 Tab 键导航到下一个元素

WebElement input1 = driver.findElement(By.name("input1"));

WebElement input2 = driver.findElement(By.name("input2"));

input1.sendKeys("First input");

input1.sendKeys(Keys.TAB); // 模拟按下Tab键,焦点将移动到下一个输入框

input2.sendKeys("Second input");

作用:在第一个输入框输入 "First input" 后,按下 Tab 键,将焦点移动到下一个输入框,然后输入 "Second input"。

3. 组合按键操作(例如复制和粘贴)

WebElement inputField = driver.findElement(By.name("input"));

inputField.sendKeys("Text to be copied");

inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本

inputField.sendKeys(Keys.CONTROL + "c"); // 复制文本

inputField.sendKeys(Keys.CONTROL + "v"); // 粘贴文本

作用:在输入框中输入文本 "Text to be copied",然后使用组合键 Ctrl+A 选中所有文本,Ctrl+C 复制文本,最后使用 Ctrl+V 粘贴文本。

4. 使用箭头键进行导航

WebElement dropDown = driver.findElement(By.id("dropdown"));

dropDown.click(); // 打开下拉菜单

dropDown.sendKeys(Keys.ARROW_DOWN); // 模拟按下箭头下键

dropDown.sendKeys(Keys.ARROW_DOWN); // 再次按下箭头下键

dropDown.sendKeys(Keys.ENTER); // 选择当前选项

作用:点击下拉菜单,使用箭头下键两次选择第三个选项,并按下回车键确认选择。

在Selenium WebDriver中,可以使用 sendKeys 方法和 Keys 枚举来模拟键盘组合键操作,如 Ctrl+C、Ctrl+V、Ctrl+A 等。组合键通常用于选择、复制、粘贴等操作。以下是一些常见的键盘组合键及其示例代码。

常见键盘组合键

操作 组合键
全选 Keys.CONTROL + "a"
复制 Keys.CONTROL + "c"
粘贴 Keys.CONTROL + "v"
剪切 Keys.CONTROL + "x"
撤销 Keys.CONTROL + "z"
重做 Keys.CONTROL + "y"
新建窗口 Keys.CONTROL + "n"
打开新标签 Keys.CONTROL + "t"
关闭当前标签 Keys.CONTROL + "w"
查找 Keys.CONTROL + "f"
保存 Keys.CONTROL + "s"
打开浏览器开发工具 Keys.CONTROL + Keys.SHIFT + "i"

示例代码

1. 组合键 Ctrl+A 全选

WebElement inputField = driver.findElement(By.name("input"));

inputField.sendKeys("Text to be selected");

inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本

2. 组合键 Ctrl+C 复制

WebElement inputField = driver.findElement(By.name("input"));

inputField.sendKeys("Text to be copied");

inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本

inputField.sendKeys(Keys.CONTROL + "c"); // 复制文本

3. 组合键 Ctrl+V 粘贴

WebElement inputField = driver.findElement(By.name("input"));

inputField.sendKeys(Keys.CONTROL + "v"); // 粘贴文本

4. 组合键 Ctrl+A, Ctrl+C, Ctrl+V 组合操作

WebElement inputField1 = driver.findElement(By.name("input1"));

WebElement inputField2 = driver.findElement(By.name("input2"));

inputField1.sendKeys("Text to be copied");

inputField1.sendKeys(Keys.CONTROL + "a"); // 全选文本

inputField1.sendKeys(Keys.CONTROL + "c"); // 复制文本

inputField2.sendKeys(Keys.CONTROL + "v"); // 粘贴文本到第二个输入框

5. 组合键 Ctrl+F 查找

driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL + "f");

使用 Actions 类进行更复杂的组合键操作

对于一些更复杂的键盘操作,可以使用 Actions 类来实现。

示例:使用 Actions 类执行 Ctrl+A 和 Ctrl+C

import org.openqa.selenium.By;

import org.openqa.selenium.Keys;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.interactions.Actions;

public class KeyboardCombinationExample {

public static void main(String[] args) {

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

// 初始化WebDriver

WebDriver driver = new ChromeDriver();

// 打开一个网页

driver.get("https://www.example.com");

// 找到输入框并输入文本

WebElement inputField = driver.findElement(By.name("input"));

inputField.sendKeys("Text to be copied");

// 使用Actions类执行组合键Ctrl+A(全选)和Ctrl+C(复制)

Actions actions = new Actions(driver);

actions.keyDown(Keys.CONTROL)

.sendKeys("a")

.keyUp(Keys.CONTROL)

.perform();

actions.keyDown(Keys.CONTROL)

.sendKeys("c")

.keyUp(Keys.CONTROL)

.perform();

// 关闭浏览器

driver.quit();

}

}

三、通过Action类模拟鼠标动作

在Selenium中,鼠标事件是通过Actions类来实现的。这个类提供了模拟各种鼠标动作的方法,例如点击、双击、右键点击、拖放等。下面是一些常用的鼠标事件及其对应的方法:

点击(Click)

单击(Click): 使用click()方法。双击(Double Click): 使用doubleClick()方法。右键点击(Context Click): 使用contextClick()方法。

移动(Move)

移动到元素(Move to Element): 使用moveToElement(WebElement target)方法,可以将鼠标移动到指定的元素上。移动并点击(Move to Element and Click): 结合moveToElement()click()方法,可以移动到元素并进行点击。

拖放(Drag and Drop)

直接拖放(Drag and Drop): 使用dragAndDrop(WebElement source, WebElement target)方法,将元素从一个位置拖到另一个位置。拖放到偏移位置0t): 使用dragAndDropBy(WebElement source, int xOffset, int yOffset)方法,将元素拖放到指定的偏移位置。

点击并保持(Click and Hold)

点击并保持(Click and Hold): 使用clickAndHold()方法,在指定元素上点击并保持鼠标按钮不放。释放(Release): 使用release()方法,释放鼠标按钮。

下面是一个示例代码,演示如何使用Actions类来执行这些鼠标事件:

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.interactions.Actions;

public class MouseActionsExample {

public static void main(String[] args) {

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

// 创建WebDriver实例

WebDriver driver = new ChromeDriver();

// 打开一个网站

driver.get("https://example.com");

// 创建Actions实例

Actions actions = new Actions(driver);

// 定位元素

WebElement element = driver.findElement(By.id("elementId"));

// 单击元素

actions.click(element).perform();

// 双击元素

actions.doubleClick(element).perform();

// 右键点击元素

actions.contextClick(element).perform();

// 移动到元素并点击

actions.moveToElement(element).click().perform();

// 拖放元素

WebElement source = driver.findElement(By.id("sourceElementId"));

WebElement target = driver.findElement(By.id("targetElementId"));

actions.dragAndDrop(source, target).perform();

// 拖放到偏移位置

actions.dragAndDropBy(source, 100, 50).perform();

// 点击并保持,然后释放

actions.clickAndHold(element).release().perform();

// 关闭浏览器

driver.quit();

}

}

perform()方法是一个触发器,用来执行之前定义的所有动作。

四、打印信息

在Selenium中,可以获取并打印许多关于当前网页的信息,如页面标题(title)、当前URL、页面源码、页面的Cookie等。

示例代码

下面是一个综合示例,演示了如何获取并打印这些信息:

import org.openqa.selenium.By;

import org.openqa.selenium.Cookie;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import java.util.Set;

public class WebPageInfo {

public static void main(String[] args) {

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

// 创建WebDriver实例

WebDriver driver = new ChromeDriver();

// 打开一个网站

driver.get("https://example.com");

// 获取并打印页面标题

String title = driver.getTitle();

System.out.println("Page Title: " + title);

// 获取并打印当前URL

String currentUrl = driver.getCurrentUrl();

System.out.println("Current URL: " + currentUrl);

// 获取并打印页面源码

String pageSource = driver.getPageSource();

System.out.println("Page Source: " + pageSource);

// 获取并打印页面的Cookie

Set<Cookie> cookies = driver.manage().getCookies();

for (Cookie cookie : cookies) {

System.out.println("Cookie: " + cookie);

}

// 获取并打印特定元素的文本

WebElement element = driver.findElement(By.id("elementId"));

String elementText = element.getText();

System.out.println("Element Text: " + elementText);

// 关闭浏览器

driver.quit();

}

}

五、多层框架的定位

1. 框架概念

什么是框架(Frame)?

在一个网页上,框架(Frame)是一个网页中嵌套的子网页。想象一下你有一个大盒子(网页),里面装着几个小盒子(框架)。每个小盒子里又可以装着更多的小盒子或内容。框架帮助网页设计者将网页内容分成多个独立的部分,每个部分可以单独加载和操作。

为什么要使用框架?

组织内容:框架可以帮助将一个复杂的网页分成多个部分,使得每个部分可以独立加载和操作。例如,导航栏可以放在一个框架中,内容区域可以放在另一个框架中。

提高效率:由于每个框架可以独立加载,所以页面的一部分更新时,其他部分不需要重新加载,提高了网页的效率。

多层框架(Nested Frames)

多层框架是指在一个框架里再嵌套另一个框架,就像一个盒子里放着另一个盒子。这种情况可能会使得操作网页变得复杂,因为你需要告诉浏览器你想在哪个框架里操作。

举个例子

想象你正在操作一个带有导航栏和内容区域的网页:

外层框架:这是整个网页的框架。内层框架1:在网页的左边有一个导航栏,这是一个独立的框架。内层框架2:在网页的右边有一个内容区域,这是另一个独立的框架。

当你想点击导航栏中的一个链接时,你需要先告诉浏览器你要操作的是导航栏框架,然后才能点击链接。同样,如果你想操作内容区域的某个按钮,你需要先切换到内容区域的框架,再进行操作。

在Selenium WebDriver中,处理多层框架和窗口定位、层级定位和下拉框处理是非常常见的任务。下面将详细介绍这些概念及其相关API的使用方法。

2. 多层框架的定位

在Web应用中,页面通常嵌套在多个框架(frame)中。为了在这些框架中进行操作,我们需要切换到相应的框架。

切换到框架: 使用driver.switchTo().frame()方法可以切换到指定的框架。可以通过框架的名字、ID或者WebElement对象来定位框架。

// 通过框架的名字或ID切换到框架

driver.switchTo().frame("frameNameOrId");

// 通过WebElement对象切换到框架

WebElement frameElement = driver.findElement(By.xpath("//iframe[@name='frameName']"));code>

driver.switchTo().frame(frameElement);

切换回默认内容: 使用driver.switchTo().defaultContent()方法可以从嵌套的框架中跳回到最外层的默认页面。

driver.switchTo().defaultContent();

3. 多层窗口的定位

当页面中嵌套的不是框架而是窗口时,需要使用不同的方法来切换窗口。

切换到窗口: 使用driver.switchTo().window()方法可以切换到指定的窗口。可以通过窗口的名字或句柄(handle)来定位窗口。

// 获取当前窗口句柄

String currentWindow = driver.getWindowHandle();

// 获取所有打开的窗口句柄

Set<String> allWindows = driver.getWindowHandles();

// 遍历所有窗口句柄并切换到新窗口

for (String window : allWindows) {

driver.switchTo().window(window);

// 如果需要,可以在此处添加条件判断,确保切换到正确的窗口

}

// 切换回原窗口

driver.switchTo().window(currentWindow);

4. 层级定位

在某些情况下,需要一层层地定位到具体的元素。例如,某些元素只有在特定操作之后才会显示。

// 定位父元素

WebElement parentElement = driver.findElement(By.id("parentElementId"));

// 在父元素下定位子元素

WebElement childElement = parentElement.findElement(By.className("childElementClass"));

// 进一步定位孙元素

WebElement grandChildElement = childElement.findElement(By.tagName("tag"));

5. 下拉框处理

下拉框是常见的页面元素,需要进行两次定位:一次定位到下拉框,然后定位到下拉框中的选项。

定位到下拉框并进行操作: 使用Select类来处理下拉框。

import org.openqa.selenium.support.ui.Select;

// 定位下拉框元素

WebElement dropdown = driver.findElement(By.id("dropdownId"));

// 创建Select对象

Select select = new Select(dropdown);

// 通过可见文本选择选项

select.selectByVisibleText("OptionText");

// 通过值选择选项

select.selectByValue("optionValue");

// 通过索引选择选项

select.selectByIndex(1);


综合示例

package org.example;

import org.openqa.selenium.By;

import org.openqa.selenium.Cookie;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.support.ui.Select;

import java.util.Set;

public class BaiduExample {

public static void main(String[] args) {

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

// 创建WebDriver实例

WebDriver driver = new ChromeDriver();

// 打开百度首页

driver.get("https://www.baidu.com");

// 获取并打印页面标题和当前URL

String title = driver.getTitle();

System.out.println("Page Title: " + title);

String currentUrl = driver.getCurrentUrl();

System.out.println("Current URL: " + currentUrl);

// 定位搜索输入框并输入关键词

WebElement searchBox = driver.findElement(By.id("kw"));

searchBox.sendKeys("Selenium WebDriver");

// 定位搜索按钮并点击

WebElement searchButton = driver.findElement(By.id("su"));

searchButton.click();

// 暂停几秒等待搜索结果加载(实际项目中应使用显式等待)

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 获取当前窗口句柄

String currentWindow = driver.getWindowHandle();

// 获取所有打开的窗口句柄

Set<String> allWindows = driver.getWindowHandles();

// 如果有新窗口,切换到新窗口

for (String window : allWindows) {

if (!window.equals(currentWindow)) {

driver.switchTo().window(window);

break;

}

}

// 打印搜索结果页面的标题

String resultTitle = driver.getTitle();

System.out.println("Result Page Title: " + resultTitle);

// 处理可能存在的下拉框选项(这里假设有下拉框,仅为示例)

try {

WebElement dropdown = driver.findElement(By.id("dropdownId"));

Select select = new Select(dropdown);

select.selectByVisibleText("OptionText");

} catch (Exception e) {

System.out.println("No dropdown found or failed to interact with dropdown.");

}

// 关闭浏览器

driver.quit();

}

}

六、弹出框(Alert、Confirm、Prompt)的处理

在自动化测试中,处理浏览器弹出框(如 alert、confirm、prompt)是一个常见需求。Selenium WebDriver 提供了相应的方法来处理这些弹出框。

处理 alert、confirm、prompt 弹出框的方法:

1. 获取弹出框中的文字信息:

getText() 方法用于获取弹出框中的文字信息。

Alert alert = driver.switchTo().alert();

String alertText = alert.getText();

System.out.println(alertText);

2. 接受弹出框:

accept() 方法用于点击弹出框中的确认按钮。

alert.accept();

3. 拒绝弹出框:

dismiss() 方法用于点击弹出框中的取消按钮(如果有)

alert.dismiss();

4. 在弹出框中输入值:

sendKeys() 方法用于在弹出框的输入框中输入值。这仅适用于 prompt 弹出框。

alert.sendKeys("Some text");

alert.accept();

七、处理 DIV 对话框

有时页面上的元素很多,通过属性无法准确定位元素,这时可以先定位元素所在的 div 块,然后再定位这个元素。这种方法有助于提高定位的准确性。

示例:

WebElement divBlock = driver.findElement(By.id("divID"));

WebElement targetElement = divBlock.findElement(By.className("targetClass"));

targetElement.click();

八、上传文件操作

文件上传操作在 web 应用中也很常见。Selenium WebDriver 处理文件上传并不复杂,关键是通过 sendKeys() 方法将文件路径传递给文件上传输入框。

WebElement uploadButton = driver.findElement(By.id("uploadButton"));

uploadButton.sendKeys("C:\\path\\to\\file.txt");

这里有几点需要注意:

文件路径可以是绝对路径或相对路径。上传的文件必须存在于指定路径中。sendKeys() 方法用于直接输入文件路径。

示例代码

下面是一个综合示例,展示如何处理 alert 弹出框以及文件上传操作:

import org.openqa.selenium.Alert;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

public class SeleniumExample {

public static void main(String[] args) {

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

// 创建WebDriver实例

WebDriver driver = new ChromeDriver();

// 打开示例网页

driver.get("https://example.com");

// 处理 alert 弹出框

WebElement alertButton = driver.findElement(By.id("alertButton"));

alertButton.click();

Alert alert = driver.switchTo().alert();

System.out.println(alert.getText()); // 打印弹出框中的文字信息

alert.accept(); // 点击确认按钮

// 文件上传操作

WebElement uploadButton = driver.findElement(By.id("uploadButton"));

uploadButton.sendKeys("C:\\path\\to\\file.txt"); // 上传文件

// 关闭浏览器

driver.quit();

}

}


 附录

1. 设置ChromeDriver的路径

在使用Selenium进行自动化测试时,我们需要一个浏览器驱动程序(比如ChromeDriver)来控制浏览器的操作。浏览器驱动程序是与浏览器进行通信的桥梁。我们需要告诉Selenium在哪里可以找到这个驱动程序,这就是 System.setProperty 的作用。

System.setProperty 方法

System.setProperty 方法用于设置系统属性。它接受两个参数:

第一个参数是系统属性的名称。第二个参数是系统属性的值。

在这个例子中,我们设置的是 webdriver.chrome.driver 系统属性,它的值是ChromeDriver可执行文件的路径。

具体代码解释

// 设置ChromeDriver的路径

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

这行代码的含义是告诉Selenium,ChromeDriver可执行文件位于 /path/to/chromedriver。我们需要将 /path/to/chromedriver 替换为本地计算机上ChromeDriver可执行文件的实际路径。

重要提示

确保下载的ChromeDriver版本与Chrome浏览器的版本匹配。将ChromeDriver放在一个合适的位置,并确保路径正确。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。