定位元素
Selenium 定位网页元素主要是通过元素的属性值或者元素在HTML里的路径位置,定位方式一共有8种:
定位方式 | 代码示例 |
---|---|
id属性 | driver.findElement(By.id()) |
name属性 | driver.findElement(By.name()) |
classname属性 | driver.findElement(By.className()) |
链接内容 | driver.findElenment(By.linkText()) |
标签名称 | driver.findElement(By.tagName()) |
链接的部分内容 | driver.findElement(By.partialLinkText()) |
css表达式 | driver.findElenment(By.cssSelector()) |
xpath表达式 | driver.findElenment(By.xpath()) |
- id 和 name 在一个页面往往是唯一的所以他们的定位准确度较高。
- classname 和 tagname 一般是被很多个元素使用,如果要定位单一元素的话慎用(毕竟你也很难看出来你需要的元素是不是第一个)。
上面的定位方法只能定位一个元素,如果要定位多个元素的时候,就需要换一下方式了:也就是在 element 后面加个 s 就好了。
操控元素
Selenium 操控元素必须要定位后才能执行,理论上Selenium可以模拟任何操作,比如: 单击、右击、滑动、滚动、复制粘贴、文本输入等。操作方式分为三大类:常规操作、鼠标事件操作、键盘事件操作。
常规操作
常规操作包括文本清除、文本输入、单击元素、提交表单、获取元素值等,以百度首页为例(https://www.baidu.com/)具体使用方法入下:
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
//定位输入框,并且输入火锅
driver.findElement(By.id("kw")).sendKeys("火锅");
Thread.sleep(2000);
//定位到 ‘百度一下’ 并单击
driver.findElement(By.id("su")).click();
Thread.sleep(3000);
//定位到 火锅 贴吧
driver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-tieba_3gnzZ.s-tab-tieba")).click();
//获取文本
String text = driver.findElement(By.cssSelector("#pagelet_frs-header\\/pagelet\\/head > div > div.head_content > div.card_top_wrap.clearfix.card_top_theme > div.card_top.clearfix > p")).getText();
System.out.println(text);
//隐式等待,等待超过三秒就抛出异常
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//清除输入框
driver.findElement(By.id("wd1")).clear();
Thread.sleep(3000);
driver.quit();
}
其他操作
比如获取属性值这些:
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
//获取属性值
String value = driver.findElement(By.cssSelector("#su")).getAttribute("value");
System.out.println(value);
Thread.sleep(3000);
//获取元素在页面当中的坐标位置
Point location = driver.findElement(By.cssSelector("#su")).getLocation();
System.out.println(location);
Thread.sleep(3000);
//判断元素在页面是否可见
boolean display = driver.findElement(By.cssSelector("#su")).isDisplayed();
System.out.println(display);
//判断元素是否被选,一般用于checkbox和radio
boolean select = driver.findElement(By.cssSelector("#su")).isSelected();
driver.quit();
}
浏览器操作
窗口的切换
通过 getWindowHandle() 获取窗口的句柄,然后通过 switchTo() 来完成跳转。
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
//获取当前页面的句柄
String curwindow1 = driver.getWindowHandle();
driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
//获取当前页面的句柄
String curwindow2 = driver.getWindowHandle();
//获取所有页面的句柄
Set<String> allwindow = driver.getWindowHandles();
for (String window:allwindow) {
if (window != curwindow1) {
//跳转到该句柄(页面)
driver.switchTo().window(window);
}
}
String curUrl = driver.getCurrentUrl();
System.out.println(curUrl);
driver.quit();
}
窗口的大小
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
//窗口最大化
driver.manage().window().maximize();
Thread.sleep(3000);
//最小化
driver.manage().window().minimize();
Thread.sleep(3000);
//自己设置大小
driver.manage().window().setSize(new Dimension(800, 600));
Thread.sleep(3000);
driver.quit();
}
滚动条滚动
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("火锅");
driver.findElement(By.id("su")).click();
//先置底
driver.executeScript("window.scroll(0,document.body.scrollHeight)");
Thread.sleep(3000);
//置顶
driver.executeScript("window.scroll(0,document.body.scrollTop)");
Thread.sleep(3000);
driver.quit();
}
浏览器前进后退
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("火锅");
driver.findElement(By.id("su")).click();
Thread.sleep(3000);
//后退
driver.navigate().back();
Thread.sleep(3000);
//前进
driver.navigate().forward();
Thread.sleep(3000);
driver.quit();
}
下拉框
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//定位select标签下拉框
WebElement ele=driver.findElement(By.cssSelector("X"));
//实例化select方法
Select select=new Select(ele);
//通过select索引定位选择下拉框元素,注意索引从0开始
select.selectByIndex(1);
Thread.sleep(2000);
// 通过select的value定位选择下拉框元素
select.selectByValue("03");
Thread.sleep(2000);
// 通过select的文本内容定位选择下拉框元素
select.selectByVisibleText("text");
Thread.sleep(2000);
driver.quit();
}
屏幕截图
public void test1() throws InterruptedException, IOException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("火锅");
driver.findElement(By.cssSelector("#su")).click();
//屏幕截图
Thread.sleep(3000);
File srcfile = driver.getScreenshotAs(OutputType.FILE);
//把截图保存在指定路径下
File filename = new File("./src/test/autoPic/test.png");
FileUtils.copyFile(srcfile,filename);
Thread.sleep(3000);
driver.quit();
}
鼠标事件
鼠标事件操作需要Selenium的ActionChains类来实现,ActionChains中有很多鼠标操作方法,下面就列举一些常用的方法:
作用 | 代码 |
---|---|
模拟鼠标双击 | doubleClick().perform() |
模拟鼠标单击 | click().perform() |
移动鼠标到某元素的中间位置 | moveToElement().perform() |
模拟鼠标右击动作 | contextClick().perform() |
将元素拖拽到目标位置 | dragAndDrop(source,target).perform() |
按住某个元素 | actions.clickAndHold().perform() |
键盘事件
selenium 中的 org.openqa.selenium.Keys 类提供了键盘上几乎所有按键的方法。 sendKeys() 方法可以用来模拟键盘输入,可以用它来输入键盘上的按键, 组合键。
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
WebElement element = driver.findElement(By.cssSelector("#kw"));
//输入框输入内容
element.sendKeys("火锅");
Thread.sleep(2000);
//删除最后一个文字
element.sendKeys(Keys.BACK_SPACE);
Thread.sleep(2000);
//输入空格键
element.sendKeys(Keys.SPACE);
Thread.sleep(2000);
//ctrl+a 全选输入框内容
element.sendKeys(Keys.CONTROL, "a");
Thread.sleep(2000);
//通过回车键盘来代替点击操作
element.sendKeys(Keys.ENTER);
Thread.sleep(2000);
//F5按键刷新页面
Actions action=new Actions(driver);
action.sendKeys(Keys.F5);
Thread.sleep(3000);
driver.quit();
}
上传文件
public void test1() throws InterruptedException {
ChromeDriver driver = new ChromeDriver();
//进入百度网站
driver.get("https://www.baidu.com");
driver.findElement(By.xpath("//span[@class='soutu-btn']")).click();
//上传按钮为input标签,定位上传按钮
WebElement element = driver.findElement(By.xpath("//input[@class='upload-pic']"));
Thread.sleep(2000);
//输入文件路径,上传文件
element.sendKeys("D:\\download\\test.jpg");
Thread.sleep(3000);
driver.quit();
}