本文目录
一、Selenium简介
Selenium是一个用于Web应用程序自动化测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9、10、11),Mozilla Firefox,Safari,Google Chrome,Opera等。
这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序是否能够很好的工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
二、使用Selenium的准备工作
因为Selenium是直接运行在浏览器里的,所以使用时需要对应的Selenium驱动(本文使用的是谷歌浏览器),注意浏览器与Selenium驱动的版本一定要保持一致,查看谷歌浏览器版本可点击右上角-》帮助-》关于Google:
如果浏览器与驱动版本不对应则会出现如下异常:
使用java代码来控制Selenium还需要用到以下jar包:
如果是maven项目的话,可用以下代码引入Selenium的依赖:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.0</version>
</dependency>
三、Selenium使用案例
案例1、打开百度首页并模拟搜索
代码如下:
package com.ue.demo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
/**
* 打开百度首页并模拟搜索
* @author LiJun
* @Date 2020年09月03日
* @Time 16:30
*/
public class Demo1 {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"/driver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
String url = "http://www.baidu.com";
driver.get(url);//打开指定的网站
// driver.navigate().to(url);//打开指定的网站
//找到搜索框
WebElement input = driver.findElement(By.xpath("//*[@id=\"kw\"]"));
//往搜索框填入“selenium”
input.sendKeys("selenium");
//找到“百度一下”按钮
WebElement button = driver.findElement(By.xpath("//*[@id=\"su\"]"));
//点击按钮
button.click();
// driver.close();//浏览器关闭
// driver.quit();//释放资源
}
}
运行结果:
案例2、使用QQ登录百度网盘,新建一个文件夹,随后再将其删除
代码如下:
package com.ue.demo;
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;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* 使用QQ登录百度云,新建一个文件夹,随后再将其删除
* @author LiJun
* @Date 2020年09月03日
* @Time 18:52
*/
public class Demo2 {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(3000);
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"/driver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
//浏览器全屏
driver.manage().window().maximize();
// driver.manage().window().setPosition(new Point(100, 50));
driver.manage().deleteAllCookies();
//与浏览器同步非常重要,必须等待浏览器加载完毕
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://pan.baidu.com/");
Thread.sleep(1000);
//找到“QQ账号”登录按钮
WebElement qqLoginLink = driver
.findElement(By.xpath("//*[@id=\"pass_phoenix_btn\"]/ul/li[2]/a"));
qqLoginLink.click();
Thread.sleep(1000);
//获取当前页面句柄
String handle = driver.getWindowHandle();
//获取所有页面的句柄,并循环判断不是当前的句柄 然后切换到子窗体
for (String handles : driver.getWindowHandles()) {
if (handles.equals(handle))
continue;
driver.switchTo().window(handles);
}
//由于登录输入框在frame中,需要先切换进入frame,否则找不到输入框的
driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='ptlogin_iframe']")));
//调试过程中,如果提示找不到元素,不知道是否切换成功了,可以把当前handler的source打印出来看看
// System.out.println(driver.getPageSource());
driver.findElement(By.xpath("//*[@id='switcher_plogin']")).click();
driver.findElement(By.xpath("//*[@id='u']")).sendKeys("xxx");
driver.findElement(By.xpath("//*[@id='p']")).sendKeys("xxx");
driver.findElement(By.xpath("//*[@id='login_button']")).click();
//如果直接关闭,可能被判断为还没完成登录,没有会话,所以稍等片刻
Thread.sleep(5000);
//定位到当前最新页面
Set<String> windows = driver.getWindowHandles();
driver.switchTo().window((String) windows.toArray()[windows.size() - 1]);
Thread.sleep(2000);
//登录后会有一个遮罩层提示,需要先将其关掉
WebElement kownBtn = driver.findElement(By.xpath("//*[@id=\"dialog1\"]/div[2]/div/div[2]"));
kownBtn.click();
Thread.sleep(2000);
//找到“新建文件夹”按钮
WebElement newDiskBtm = driver.findElement(By.xpath("//*[@id=\"layoutMain\"]/div[1]/div[2]/div[4]/div[2]/a[1]"));
newDiskBtm.click();
Thread.sleep(2000);
//填入文件夹名称,然后确认新建,完成文件夹新建
WebElement diskNameInput = driver.findElement(By.xpath("//*[@id=\"layoutMain\"]/div[2]/div[6]/div/input"));
diskNameInput.sendKeys("我是自动新建的文件夹");
driver.findElement(By.xpath("//*[@id=\"layoutMain\"]/div[2]/div[6]/div/span[1]")).click();
Thread.sleep(5000);
//找到刚刚新建的那个文件夹
WebElement myAutoDisk = driver.findElement(By.partialLinkText("自动新建"));
Actions actions = new Actions(driver);
//鼠标右键单击文件夹
actions.contextClick(myAutoDisk).perform();
//在点击右键后弹出来的菜单里找到“删除”,然后点击
List<WebElement> lis = driver.findElements(By.tagName("li"));
for (WebElement li : lis) {
if ("删除".equals(li.getText()))
li.click();
}
Thread.sleep(5000);
//点击确认框里的“确定”按钮,完成文件夹删除
driver.findElement(By.linkText("确定")).click();
// driver.quit();
}
}
运行结果:
1、selenium模拟了谷歌浏览器手动输入百度网盘首页链接
2、选择QQ账号方式进行登录,弹出使用QQ登录界面
3、输入账号、密码,点击登录,进入自己的百度网盘
4、点击“新建文件夹”按钮,输入文件夹的名称,完成新建
5、找到刚刚新建的文件夹,点击鼠标右键,弹出右键菜单,在右键菜单里找到“删除”进行点击,然后在弹出的确认删除框里,点击“确定”按钮,完成文件夹删除
案例3、百度网盘链接内部数据获取
代码如下:
package com.ue.demo;
import com.ue.entity.Article;
import com.ue.util.DateUtil;
import com.ue.util.StringUtil;
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.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.HashMap;
import java.util.Map;
/**
* 百度云链接内部数据获取
* 链接地址:https://pan.baidu.com/s/1rVgdoLTqsfz9mXZlUqYjSg
* 提取密码:lt5k
* @author LiJun
* @Date 2020年09月03日
* @Time 18:43
*/
public class Demo3 {
public static void main(String[] args) {
String shareUrl = "https://pan.baidu.com/s/1rVgdoLTqsfz9mXZlUqYjSg";
String password = "lt5k";
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/driver/chromedriver.exe");
//排除掉图片的加载,提升性能
Map<String, Object> preferences = new HashMap<String, Object>();
ChromeOptions options = new ChromeOptions();
preferences.put("profile.managed_default_content_settings.images", 2);
options.setExperimentalOption("prefs", preferences);
WebDriver driver = new ChromeDriver(options);
driver.get(shareUrl);
//超时等待
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
boolean loadcomplete = d.findElement(By.tagName("body")).isDisplayed();
return loadcomplete;
}
});
boolean hasPassword = false;//是否有密码
String title = driver.findElement(By.cssSelector(".pickpw.clearfix")).getText();
if (StringUtil.isNotEmpty(title) && title.contains("请输入提取码")) {
hasPassword = true;
}
if (hasPassword) {
WebElement pInput = driver.findElement(By.cssSelector(".QKKaIE.LxgeIt"));
WebElement btn = driver.findElement(By.cssSelector(".g-button-right"));
pInput.sendKeys(password);
btn.click();
}
Article article = new Article();
article.setShare_url(shareUrl);
article.setPassword(password);
try {
genPageData(driver, article);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(article);
// driver.close();//浏览器关闭
// driver.quit();//释放资源
}
/**
* 生成基本数据
*/
public static void genPageData(WebDriver driver, Article article) throws Exception {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
WebElement fileNameEle = driver.findElement(By.cssSelector(".filename"));
article.setName(fileNameEle.getText());
WebElement shareDateEle = driver.findElement(By.cssSelector(".share-file-info span"));
article.setShare_date(shareDateEle.getText());
WebElement shareUserEle = driver.findElement(By.cssSelector(".share-person-data-top a.share-person-username.global-ellipsis"));
article.setShare_user(shareUserEle.getAttribute("textContent"));
article.setContent(fileNameEle.getText());//预先设置
article.setState(1);
article.setInclude_date(DateUtil.getCurrentDateStr());
}
}
运行结果:
1、selenium模拟了谷歌浏览器手动输入百度云分享链接
2、打开了需要输入提取码的页面,selenium再次模拟了人工输入百度云链接提取码
3、selenium再次模拟了人工点击 ”提取文件” 按钮
4、最后selenium能够如同jsoup一样,分析提取个人所需有用信息