selenium简单操作
创建ChromeDriver
private ChromeDriver driver = new ChromeDriver(
new ChromeOptions().addArguments("--remote-allow-origins=*"));
定义打开关闭方法
//打开网址
public void start_test(){
driver.get("http://www.baidu.com");
}
//关闭浏览器
public void end_test(){
driver.quit();
}
网页定位方法
public void pos_test() throws InterruptedException {
//css选择器
String str = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
System.out.println("news: "+ str);
//xpath选择器
driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("Apex");
driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
Thread.sleep(3000);
driver.findElement(By.xpath("//*[@id=\"m6004743517_canvas\"]/div/div/div[2]/div/a"));
String str = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).getText();
System.out.println("结果: "+ str);
}
public void operate_test() throws InterruptedException {
//点击行为
driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).click();
//提交行为
driver.findElement(By.cssSelector("#kw")).sendKeys("Apex");
driver.findElement(By.cssSelector("#su")).submit(); //click是点击,submit是提交(submit操作按钮或者能回车提交的地方)
//按键模拟输入和clear()
driver.findElement(By.cssSelector("#kw")).sendKeys("Apex"); //可以输入任何字符
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("again");
//gettext()获取文本和getAttribute()标签
//<input type="submit" id="su" value="百度一下" class="bg s_btn">
String str = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
String str2 = driver.findElement(By.cssSelector("#su")).getAttribute("value"); //里面放属性名用于获取属性值
System.out.println("getText: "+ str);
System.out.println("getAttribute: "+ str2);
}
//等待(代码执行很快,前端页面渲染速度相对较慢,可能代码已经执行到下一步,页面还没渲染结束,导致下一条命令找不到页面元素而报错)
public void wait_test() throws InterruptedException {
driver.findElement(By.cssSelector("#kw")).sendKeys("Apex");
driver.findElement(By.cssSelector("#su")).click();
//强制等待
Thread.sleep(3000); //等待渲染,以防报错
//隐式等待(作用在整个生命周期,只要写在方法内就行)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3)); //设置时间范围为3秒
//显示等待
WebDriverWait foo = new WebDriverWait(driver,Duration.ofSeconds(3));
foo.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#kw")));
foo.until(ExpectedConditions.textToBe(By.cssSelector(""),"Apex"));
//WebDriverWait第一个参数:webdriver对象 第二个参数:Duration类方法(设置时间方法)
//ExpectedConditions里有很多方法,自行查看。
// presenceOfElementLocated()是查看当前元素是否存在
//textToBe()检查页面元素对应的文本我是否正确 第一个参数:元素位置,第二个参数:期望得到文本值
driver.findElement(By.cssSelector("#m6004743517_canvas > div > div > div.tenon_pc_comp_columbus_banner_content_container > a"));
}
}
等待分为强制等待,隐式等待,显示等待
强制等待
优点:语法简单,适合调试的时候用
缺点:等待时间固定,如果web自动化数量多,造成大量时间消耗,减少自动化测试效率
隐式等待:在规定时间范围内,轮询等待元素出现之后就立即结束,超过时间没找到会抛出noSuchElement异常
优点:节省时间
缺点:需要等待所有元素都展现才会执行下一步,仍然会有时间上的消耗
显示等待:针对某一个元素进行等待,直到满足条件,超出时间抛出异常
优点:针对性,极大的降低自动化整体的等待时间
缺点:写法更为复杂
进入www.baidu.com后跳转到新网页的获取问题
//打印
public void print_test() throws InterruptedException {
//进入后点击超链接
driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a")).click();
Thread.sleep(2000);
//获取标题
String title = driver.getTitle();
System.out.println("title: " + title);
//获取url
String url = driver.getCurrentUrl();
System.out.println("url: " + url);
}
此处点击超链接后,获取的title和url仍然是原网页的信息,想要切换到操作新页面,需要用到页面的句柄(唯一标识)
用switchTo()跳转
public void changewindow_test() throws InterruptedException {
//每个页面都有一个句柄(唯一标识)
//获取当前页面句柄
String curwindow = driver.getWindowHandle();
System.out.println("curwindow-handle: " + curwindow);
driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a")).click();
Thread.sleep(2000);
//获取所有页面句柄
Set<String> allwindow = driver.getWindowHandles();
for(String window:allwindow){
if(window != curwindow){
//跳转到该页面
driver.switchTo().window(window);
}
System.out.println("the Set have: " + window);
}
}
窗口设置
public void window_test() throws InterruptedException {
driver.manage().window().maximize();
Thread.sleep(2000);
driver.manage().window().minimize();
Thread.sleep(2000);
driver.manage().window().setSize(new Dimension(1000,800)); //填入宽度,高度
Thread.sleep(2000);
//selenium不能直接编译js语言,但可以通过executeScript()方法使用
//跳转到头
driver.executeScript("window.scroll(0,document.body.scrollHeight)");
//跳转到尾
driver.executeScript("window.scroll(0,document.body.scrollTop)");
}
导航
navigate()方法
public void navigate_test() throws InterruptedException {
//进入一个页面进行前进和后退操作,该操作不能用于网页跳转
driver.manage().window().maximize();
Thread.sleep(2000);
driver.findElement(By.cssSelector("#nav > div > div > ul > li:nth-child(1) > a")).click();
Thread.sleep(2000);
//后退
driver.navigate().back();
Thread.sleep(2000);
//前进
driver.navigate().forward();
Thread.sleep(2000);
}
弹窗
用Alert对象处理
public void alert_test() throws InterruptedException {
//普通弹窗操作
//点击后出现弹窗
driver.findElement(By.cssSelector("#show")).click();
//点击按钮,关闭弹窗
driver.findElement(By.cssSelector("关闭按钮的selector")).click();
Thread.sleep(2000);
//无法在前端定位按钮的弹窗(如:警告弹窗,确认弹窗),使用selenium中提供的Alert接口来处理
driver.findElement(By.xpath("//*[@id=\"tooltip\"]")).click();
//创建Alert对象
Alert alert = driver.switchTo().alert();
//确认按钮
alert.accept();
//取消按钮
alert.dismiss();
//不能定位的带输入框的弹窗
driver.findElement(By.cssSelector("元素的xpath")).click();
Alert alert2 = driver.switchTo().alert();
alert2.sendKeys("test");
alert2.accept();
}
键盘和鼠标
Actions对象
public void mouseAndKeyboard_test() throws InterruptedException {
driver.manage().window().maximize();
Thread.sleep(2000);
//模拟鼠标移动到想要的元素上,并点击
WebElement ele = driver.findElement(By.cssSelector("#nav > div > div > ul > li:nth-child(1) > a")); //找到元素
Actions actions = new Actions(driver);
actions.clickAndHold(ele).perform(); //perform()是显示,可不加
actions.click(ele).perform();
//键盘
WebElement ele = driver.findElement(By.cssSelector("#kw"));
ele.sendKeys("test");
//driver.findElement(By.cssSelector("#kw")).sendKeys("test");
}
选择框
public void select_test(){
WebElement ele = driver.findElement(By.cssSelector("#shoppingMethod"));
Select select = new Select(ele);
//通过索引(索引从0开始)
select.selectByIndex(0);
//通过value
select.selectByValue("value值");
//通过可见文本
select.selectByVisibleText("直接放文本");
}
文件上传
页面中点击文件上传会弹出系统窗口,selenium不能操作系统窗口。
通过sendkeys()输入文件路径达到上传目的
public void fileupload_test(){
//地位到文件上传按钮
WebElement ele = driver.findElement(By.cssSelector("selector"));
ele.sendKeys("文件路径地址");
}
屏幕截图
代码执行速度比网页渲染速度快,用截图可以清楚代码执行时,页面状态,了解报错。
getScreenshotAs()方法,参数OutputType.x,x可以选择FILE,Base64,bytes。
public void screenshot_test() throws IOException {
//driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//百度搜索关键词并验证结果页
driver.findElement(By.cssSelector("#kw")).sendKeys("Apex");
driver.findElement(By.cssSelector("#su")).click();
//屏幕截图
File srcFile = driver.getScreenshotAs(OutputType.FILE);
//保存截图到指定位置
File filename = new File("./src/test/autoPic/test2.png");
FileUtils.copyFile(srcFile,filename);
driver.findElement(By.cssSelector("#m6004743517_canvas > div > div > div.tenon_pc_comp_columbus_banner_content_container > a"));
}