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.F1 到 Keys.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放在一个合适的位置,并确保路径正确。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。