这个倒是很久之前写的了,代码看起来可能有点乱,凑合看吧()
毕竟java写这个不是主流。
需要先在maven文件中加入两个包依赖
selenium镜像地址(https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java)
TestNG镜像地址(https://mvnrepository.com/artifact/org.testng/testng)
图中代码如下:
//当前使用的是使用人最多的版本,并非最新版selenium
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
//使用的是6.8.8版本的TestNG
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
<scope>test</scope>
</dependency>
</dependencies>
然后将浏览器驱动如Chrome浏览器的驱动Chromedriver.exe(记得下载的时候,看看自己的谷歌浏览器是什么版本,如果版本不适配,则不适用),放置在src文件中新建的目录drivers中(D:\java+selenium\src\drivers\chromedriver.exe)然后再将chromedriver引入到文件中。
其实这一块的代码是根据b站网课自学的,所以说注释比较多,看起来比较乱
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
import java.nio.file.Path;
import java.nio.file.Paths;
public class test {
public WebDriver webDriver;
@Test
public void openBaidu(){
//引入Chromedriver
Path p1= Paths.get("src","drivers","chromedriver.exe");
System.setProperty("webdriver.chrome.driver",p1.toAbsolutePath().toString());
//创建浏览器实例
webDriver=new ChromeDriver();
//打开百度
webDriver.get("https://www.baidu.com");
//定位百度的搜索框元素,并且输入数据(ID定位) ——唯一的
//webDriver.findElement (By.id("kw")).sendKeys("腾讯课堂");
//定位百度的搜索枉元素,并且输入数据(Name定位) ——会重复
//webDriver.findElement(By.name("wd")).sendKeys("腾讯课堂");
//定位到百度的搜索抵元素,并且输入数据(tagName)——找到的元素是会有多个——不推荐
//webDriver.findElement(By,tagName("input")).sendKeys("腾讯课堂");
//定位到百度的搜索框元素,并且输入数据(className定位)
//webDriver.findElement(By.className("s_ipt")).sendKeys("腾讯课堂");
//Compound class names not permitted -->复合类名的问题(不能放入符合类名,只能放入唯一的类名,否则会找错样式)
//webDriver.findElement(By.className("s_btn")).click();
//定位”新闻”元素,并且点击(LinkText定位) --> 超链接完整文本
//webDriver.findElement(By.linkText("新闻")).click();
//定位”新闻”元素,并且点击(partialLinkText定位) --> 超链接部分文本
//webDriver.findElement(By.partialLinkText("新闻")).click();
//cssSelector元素定位
//(1) tagName定位
//webDriver.findElement(By.cssSelector("input"));
//(2)id定位(需要在id前面加入一个“#”作为标识符,例:#id)
//webDriver.findElement(By.cssSelector("#kw")).sentKeys("腾讯课堂");
//(3)根据className定位(需要在样式名前加入一个“.”,例:.s_btn)
//webDriver.findElement(By.cssSelement(.s_ipt)).sentKeys("腾讯课堂");
//webDriver.findElement(By.cssSelement(.bg.s_btn)).click();
//定位到百度一下,根据cssSelector定位可以用多种样式,但是每个样式前需要加.
// css精确定位
//根据元素属性,属性名=属性值,id,class,等都可写成这种形式,单属性:By.cssSelector("标签名[属性名=属性值]");
//如:By.cssSelector("input[name='xxx']");
//多属性
//By.cssSelector(“标签名[属性1=属性值][属性2=属性值]”);
//单属性
//webDriver.findElement(By.cssSelector("input[maxlength='255']")).sentKeys("腾讯课堂");
//多属性
//webDriver.findElement(By.cssSelector("input[maxlength='255'][autocomplete='off']")).sentKeys("腾讯课堂");
}
}
//元素操作API
// getTagName ()
//获取元素的的标签名
// getAttribute(属性名)
// 根据属性名获取元素属性值
//getText()
//获取当前元素的文本值
//isDisplayed()
//查看元素是否显示
//WebDriver相关API
//get(String url)
//访问指定url页面
//getCurrentUrl()
//获取当前页面的url地址
//getTitle()
//获取当前页面的标题
//getPageSource()
//获取当前页面源代码
//quit()
//关闭驱动对象以及所有相关的窗口
//close()
//关闭当前窗口
//getWindowHandle()
//返回当前页面句柄
//getWindowHandles()
//返回所有由驱动对象打开页面所有的句柄,页面不同,句柄不一样
//manage()
//此方法可以获取Optiona--浏览器菜单操作对象
driver.manage().window()
//navigate对象
//Navigation navigation=driver.navigate()
//获取navigate对象
//navigation.to(url)
//访问指定的url地址
//navigation.refresh()
//刷新当前页面
//navigation.back()
//浏览器回退操作
//navigation.forward()
//浏览器前进操作
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.nio.file.Path;
import java.nio.file.Paths;
public class test2 {
private static void openChrome() {
//打开浏览器
Path p1 = Paths.get("src", "drivers", "chromeDriver.exe");
System.setProperty("webdriver.chrome.driver", p1.toAbsolutePath().toString());
//创建浏览器实例
chromeDriver = new ChromeDriver();
}
public static ChromeDriver chromeDriver;
public static WebElement webElement2;
public static void main(String[] args) throws test, InterruptedException {
openChrome();
// get(String url)
//访问指定ur1页面
chromeDriver.get("https://www.baidu.com");
// 等待3s
//Thread.sleep(3000);
//chromeDriver.findElement(By.id("kw")).clear();//清理id为kw的输入框中的元素
WebElement webElement1 = chromeDriver.findElement(By.id("kw"));
chromeDriver.findElement(By.id("kw")).sendKeys("腾讯课堂");
chromeDriver.findElement(By.id("su")).click();//点击百度一下按钮
// getTagName ()
//获取元素的的标签名
System.out.println("得到元素的标签名:" + webElement1.getTagName());
// getAttribute(属性名)
// 根据属性名获取元素属性值
System.out.println("得到当前的maxlength属性:" + webElement1.getAttribute("maxlength"));
webElement2 = chromeDriver.findElement(By.xpath("//a[text ()='设置']"));
//getText()
//获取当前元素的文本值
System.out.println("得到元素的文本值:" + webElement2.getText());
//isDisplayed()
//查看元素是否显示
System.out.println("元素是否显示" + webElement2.isDisplayed());
// getCurrentUr1(
// 获取当前页面的ur1地址
System.out.println("当前的URI为:" + chromeDriver.getCurrentUrl());
// getTitle()
// 获取当前页面的标题
System.out.println("当前的标题为:" + chromeDriver.getTitle());
// getPageSource ()
// 获取当前页面源代码
//System,out,printIn("当前页面的源代码为:"+chromeDriver,getPageSource());/ / quit ()
// 关闭驱动对象以及所有相关的窗口
//chromeDriver.quit();
//close()
// 关闭当前窗口
System.out.println("新窗口打开前的柄:" + chromeDriver.getWindowHandle());
System.out.println("新窗口打开前的所有句柄:" + chromeDriver.getWindowHandles());
Thread.sleep(3000);
chromeDriver.findElement(By.xpath("//a[text()='的微博_微博']")).click();
Thread.sleep(1000);
System.out.println("新窗口打开后的句柄:" + chromeDriver.getWindowHandle());
System.out.println("新窗口打开后的所有句柄:" + chromeDriver.getWindowHandles());
//navigation对象
WebDriver.Navigation navigation = chromeDriver.navigate();
//访问京东
navigation.to("https://www.jd.com");
Thread.sleep(1000);
//刷新网页
navigation.refresh();
Thread.sleep(1000);
//回退
navigation.back();
Thread.sleep(1000);
//前进
navigation.forward();
}
}
/*三大等待:硬性等待、隐式等待、显示等待
硬性等待:Thread.sleep(time)单位毫秒
隐式等待:driver.manage.timeouts().implicitlywait(long time(超时的时间),TimeUnit unit(时间的单位))
显示等待:WebDriver.Wait wait=new WebDriverWait();
WebElement element=wait.until(expectCondition);
显示等待的方法
visibilityOfElementLocated(By locator)等待元素在页面存在且可见
elementToBeClickable(By locator)页面元素是否在页面上可用和可被单击
elementToBeSelected(WedElement element)页面元素处于被选中状态
textToBePresentInElement(By locator)在页面元素中是否包含特定的文本
presenceOfElementLocated(By locator)页面元素在页面中存在*/
public void openBaidu()throws InterruptedException{
// webDriver.manage().window().maximize();//最大化浏览器
//在driver实例化完成后设置隐形等待,设置超时的时间为5s
// chromeDriver.manage().timeouts().implicitlyWait(time(超时的时间), unit(时间的单位));
// chromeDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
chromeDriver.get("https://www.baidu.com");//打开百度,测试的登录框的地址
// 定位百度的搜索框元素,并且输入数据(ID定位) ——唯一的
chromeDriver.findElement (By.id("kw")).sendKeys("腾讯课堂");
chromeDriver.findElement(By.id("su")).click();
//代码执行太快,导致UI没有立马展示出来,造成两者不同步,从而元素找不到
// Thread.sleep(3000);
//显性等待,以ExpectedConditions.visibilityOfElementLocated为例
WebDriverWait webDriverWait=new WebDriverWait(chromeDriver,5);
webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[text()=' - 百度百科']")));
chromeDriver.findElement(By.xpath("//a[text()=' - 百度百科']")).click();
}
public void openBaidu() throws InterruptedException {
//打开浏览器
Path p1 = Paths.get("src", "drivers", "chromedriver.exe");
System.setProperty("webdriver.chrome.driver", p1.toAbsolutePath().toString());
//创建浏览器实例
chromeDriver = new ChromeDriver();
//打开本地文件(因为是用的同一文件,因此这里没有更改)
chromeDriver.get("D:\\VsCodeword\\newWork\\vue\\demo\\test.html");
//点击按钮
chromeDriver.findElement(By.id("abtn")).click();
Thread.sleep(2000);
//switchTo.alert 找到对应的alert提示框
//Alert alert=chromeDriver.switchTo().alert();
//点击提示框的确定
//alert.accept();
//取消或x掉提示框
//alert.dismiss();
//控制台打印弹出框的内容
//System.out.println(alert.getText());
Alert alert=chromeDriver.switchTo().alert();
Thread.sleep(2000);
//alert.accept();//点击确定,弹出1
//alert.dismiss();//点击取消,弹出2
//Thread.sleep(2000);
//alert.accept();//点击回显1/2的弹框的确定
System.out.println(alert.getText());
}
/*#### 特殊元素定位与操作
##### ifame切换
driver.switchTo().frame(index);
driver.switchTo().frame(id);
driver.switchTo().frame(name);
driver.switchTo().frame(WebElement);
切换后回到默认内容页面(否则会找不到元素)
driver.switchTo().defaultContent();*/
public void iframe() throws InterruptedException {
//打开浏览器
Path p1 = Paths.get("src", "drivers", "chromedriver.exe");
System.setProperty("webdriver.chrome.driver", p1.toAbsolutePath().toString());
//创建浏览器实例
chromeDriver = new ChromeDriver();
//打开本地文件(因为是用的同一文件,因此这里没有更改)
chromeDriver.get("D:\\VsCodeword\\newWork\\vue\\demo\\test.html");
chromeDriver.findElement(By.id("aa")).sendKeys("111");
Thread.sleep(2000);
chromeDriver.switchTo().frame("bframe");
chromeDriver.findElement((By.id("bb"))).sendKeys("222");
Thread.sleep(2000);
chromeDriver.switchTo().frame("cframe");
chromeDriver.findElement(By.id("cc")).sendKeys("333");
//回到默认页面
chromeDriver.switchTo().defaultContent();
chromeDriver.findElement(By.id("aa")).clear();
chromeDriver.findElement(By.id("aa")).sendKeys("回到了最外层");
}
/*##### select下拉框
如果页面元素是一个下拉框,我们可以将此web元素封装为Select对象。
Select selece=new Select(WebElement element);
Select对象常用api
select.getOptions();//获取所有选项
select.selectByIndex(index);//根据索引选中对应的元素
select.selectByValue(value);//选择指定value值对应的选项
select.selectByVisibleText(text);//选中文本值对应的选项*/
@Test
public void select() throws InterruptedException {
//打开浏览器
Path p1 = Paths.get("src", "drivers", "chromedriver.exe");
System.setProperty("webdriver.chrome.driver", p1.toAbsolutePath().toString());
//创建浏览器实例
chromeDriver = new ChromeDriver();
//打开本地文件(因为是用的同一文件,因此这里没有更改)
chromeDriver.get("https://www.baidu.com");
//打开百度的设置
chromeDriver.findElement(By.id("s-usersetting-top")).click();
//点击高级设置
chromeDriver.findElement(By.xpath("//div[@id='s-user-setting-menu']/div/a[2]/span")).click();
//找到时间选择下拉框
chromeDriver.findElement(By.xpath("//span[@id='adv-setting-gpc']/div/div/i")).click();
//根据索引去选择对应的选项
chromeDriver.findElement(By.xpath("//span[@id='adv-setting-gpc']/div/div[2]/div[2]/p[3]")).click();
//再次打开时间下拉框
chromeDriver.findElement(By.xpath("//span[@id='adv-setting-gpc']/div/div")).click();
//选择选项
chromeDriver.findElement(By.xpath("//span[@id='adv-setting-gpc']/div/div[2]/div[2]/p[4]")).click();
}
时间日期控件
如果可以手动输入则使用sendKeys方法输入时间
如果有限制输入,则可以执行一段js改变元素的value值
JavascriptExecutor jsExecutor=(JavascriptExecutor)driver;
jsExecutor.executeScript("…");
//时间日期控件处理
//普通可以输入的input类型时间日期控件
//chromeDriver,get("https://ww,fligay,com/?ttid=sem,000000736shlreferid-baidu.082076aroute source=seo");
//chromeDriver,findElement(By.xpath("//form[@id='j_FlightForm']//input[@name=('depDate']")).sendKeys ("2020-01-10");
//限制输入的时间日期控件chromeDriver.qet("https://www.12306.cn/index/");
//javascript执行对象
JavascriptExecutor javascriptExecutor =(JavascriptExecutor)chromeDriver;
//调用javascript去除id为train_date输入框内的readonly属性
javascriptExecutor.executecript("document.getElementById(\"train_date\").removeAttribute(\"readonly\") ");
Thread.sleep(1000);
chromeDriver,findElement(By,id("train_date")) .clear();
Thread.sleep(1000);
chromeDriver.findElement(By.id("train_date")).sendKeys("2020-01-10");
//鼠标操作
@Test
public void shubiao() {
Path p1 = Paths.get("src", "drivers", "chromedriver.exe");
System.setProperty("webdriver.chrome.driver", p1.toAbsolutePath().toString());
chromeDriver = new ChromeDriver();
//鼠标操作
chromeDriver.get("http://www.treejs.cn/v3/demo/cn/exedit/drag.html");
WebElement sourceElement = chromeDriver.findElement(By.id("treeDemo_2_span"));//定位移动的元素
WebElement targetElement = chromeDriver.findElement(By.id("treeDemo_3_span"));//目标元素
//实例化actions对象,鼠标的相关操作
Actions actions = new Actions(chromeDriver);
actions.clickAndHold(sourceElement).moveToElement(targetElement).release().build().perform();
}
}
文件上传
分为两种情况: 类似于下面,使用sendKeys写入文件的路径<input type="file"id="fu" value="选择文件"> 如果文件上传不是input元素,而是使用的第三方的控件。并且不是input元素,那么这种情况就很棘手了,必须要使用一些第三方的工具,比如autoit等来完成。
chromeDriver,findElement(By.xpath("//input[@value='选择文件(value值)']")),sendKeys("本地的文件地址,记得\的转义");
Thread.sleep(2000);
chromeDriver.findElement(By.xpath("//input[@value='上传']")).click();
大概就是这些,抛砖引入,可能我有些地方写的比较乱,请多多见谅。