文章目录
selenium-WebDriver API定位
常用控件操作
功能 | 方法 |
---|---|
点击 | click() |
获取文本内容 | getText() |
写入内容 | sendKeys() |
清空文本框输入内容 | clear() |
提交相当于回车操作 | submit() |
WebDriver基础应用中有相对复杂的例如下拉框这样的控件操作描述。
打开浏览器
-
火狐浏览器
System.setProperty("webdriver.gecko.driver","D:\\demo\\geckodriver.exe"); System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla"); WebDriver wd=new FirefoxDriver();
-
谷歌浏览器
System.setProperty("webdrriver.chrome.driver","D:\\demo\\chromedriver.exe"); WebDriver driver=new ChromeDriver();
-
IE浏览器
System.setProperty("webdriver.ie.driver","D:\\demo\\chromedriver.exe"); WebDriver wd=new InternetExplorerDriver();
关闭浏览器
driver.close():关闭当前的浏览器窗口,不会关闭geckodriver的进程;
driver.quit():不仅关闭窗口,还会彻底的退出webdriver,释放与driver server之间的连接,关闭进程。
WebDriver对浏览器的操作
-
访问某网页的地址:driver.get(“https://www.vaidu.com/”)
-
返回/前进/刷新:
driver.navigate().back(); driver.navigate().forward(); driver.navigate().refresh();
浏览器尺寸的控制
//设置浏览器的大小:
Dimension size=new Dimension(300,400);
driver.manage().window().setSize(size);
//浏览器最大化
driver.manage().window().maximize();
访问链接-打印页面信息
String title=driver.getTitle();
String current=driver.getCurrentUrl();
String htmlsrc=driver.getPageSource();
System.out.println(title);
元素定位
定位方法 | 实例 |
---|---|
ID | driver.findElement(By.id(“id值”)) |
name | driver.findElement(By.name(“name值”)) |
链接的全部文字 | driver.findElement(By.linkText(“linkText”)) |
部分链接文字 | driver.findElement(By.partialLinkText(“部分linkText值”)) |
xpath方式 | driver.findElement(By.xpath(“xpath的值”)) |
CSS | driver.findElement(By.cssSelector(“css定位表达式”)) |
Class名称 | dirver.findElement(By.className(“class属性值”)) |
标签名称 | driver.findElement(By.tagName(“标签名称”)) |
多个标签 | ListscriptList=driver.findElements(By.tagName(“a”)); |
xpath查找
-
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历,XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
例如:
driver.findElement(By.xpath("//*[@id=\"toolbar-search-input\"]")).click(); WebElement button= driver.findElement(By.xpath(“//input[@value=‘查询’]”)
- XML是指可扩展标记语言,被设计用来传输和存储数据, XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。
Xpath语法:
表达式 | 描述 |
---|---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的结点,而不考虑他们的位置 |
@ | 选取属性 |
* | 匹配任何元素结点 |
@* | 匹配任何属性结点 |
//* | 选取文档中所有元素 |
//title[@*] | 选取所有带属性title的元素 |
使用页面元素的文本来定位元素:
适合没有任何属性值的
driver.findElement(By.xpath("//a[text()='贴吧']")).click();
模糊匹配:适合属性变化的
driver.findElement(By.xpath("//a[contains(text(),'吧')]")).click();
也适合变化的属性,像变化的id
//starts-with里面的iframe为地址的前几个不会改变的字母
driver.findElement(By.xpath("//a[starts-with(text(),'贴')]").click();
driver.findElement(By.xpath("//a[starts-with(@id,'iframe')]").click();
CSS查找
CSS 的引进是为了让 页 面 信 息 和 样 式 信 息 可 以 分 开 。css定位速度要比xpath快,css通过By.cssSelector(“css定位表达式”)在页面上查找元素
例如:driver.findElement(By.cssSelector(“html>body>div[1]>input[type=‘button’]”));
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2hFmbTZ-1647698332132)(C:\Users\yyc\AppData\Roaming\Typora\typora-user-images\image-20220312213823414.png)]
简单练习
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.gecko.driver", "D:\\software\\RunningCheeseFirefox\\Firefox\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin", "D:\\software\\RunningCheeseFirefox\\Firefox\\firefox.exe");
WebDriver driver=new FirefoxDriver();
//使窗口最大化
driver.manage().window().maximize();
//打开百度
driver.get("https:/baidu.com");
Thread.sleep(3000);
//linkText()
driver.findElement(By.linkText("新闻")).click();
// Thread.sleep(3000);
//name()
driver.findElement(By.name("wd")).sendKeys("123");
//xpath-text()
driver.findElement(By.xpath("//a[text()='贴吧']")).click();
//xpath-contains()
driver.findElement(By.xpath("//a[contains(text(),'贴')]")).click();
//xpath-starts-with()
driver.findElement(By.xpath("//a[starts-with(text(),'贴')]")).click();
driver.findElement(By.xpath("//a[starts-with(@class,'mnav c-font-normal ')]")).click();
}
遍历表格练习
[移动](file:///E:/test/03table.html)
- 遍历表格的全部单元格
- 定位指定的单元格
- 定位单元格中的子元素
public class Cuu {
public static WebElement findCell(WebElement table, int row, int coll) {
WebElement now_row = table.findElements
(By.tagName("tr")).get(row - 1);
WebElement now_cell = now_row.findElements
(By.tagName("td")).get(coll - 1);
return now_cell;
}
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.gecko.driver", "D:\\software\\RunningCheeseFirefox\\Firefox\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin", "D:\\software\\RunningCheeseFirefox\\Firefox\\firefox.exe");
//实例化浏览器 Alt+\
WebDriver driver = new FirefoxDriver();
//打开页面 test/03table.html
driver.get("file:///E:/test/03table.html");
//找到表格 table=findElement
WebElement table = driver.findElement(By.tagName("table"));
//找到所有的行table.findElements(by)
List<WebElement> rows = table.findElements(By.tagName("tr"));
//遍历行,找到每一行所有的列 tr.findElements(by)
for (WebElement row : rows) {
//遍历单元格,打印出每个单元格的信息
List<WebElement> colls = row.findElements(By.tagName("td"));
for (WebElement coll : colls) {
System.out.print(coll.getText() + " ");
}
System.out.println();
}
findCell(table, 3, 1).findElement(By.tagName("input")).sendKeys("3,1");
findCell(table, 2, 3).findElement(By.xpath("//input[@type='checkbox']")).click();
Thread.sleep(6000);
driver.quit();
}
}
WebDriver基础应用
切换多窗口操作
//如果报错显示org.openqa.selenium.NoSuchElementException
//可能有一下原因:
1.页面还未加载完成 get()、click()之后加个Thread.sleep(3000)
2.是不是定位方式写错了,空格
3.多窗口问题,是否需要切换窗口
使用getWindowHandle方法获取当前浏览器窗口的句柄
使用getWindowHandles方法获取所有弹出的浏览器窗口的句柄
driver.get("https:/baidu.com");
javascriptExecutor isExecutor=(JavascriptExecutor)driver;
jaExecutor.executeScript("window.open("")");
System.out.println(driver.getTitle());
Thread.sleep(3000);
Set<String>windows=driver.getWindowHandles();
for(String s:windows){
String t=driver.swithTo().window(s).getTitle();
boolean flag=t.contains("页面");
if(flag){
driver.findElement(By.id("username")).sendKeys("hello");
}
}
bugfree切换页面练习
public class MultiWindow {
public static void main(String[] args) throws InterruptedException {
String url = "http://localhost:8032/bugfree/";
System.setProperty("webdriver.gecko.driver",
"D:\\demo\\demo1\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get(url);
Thread.sleep(3000);
driver.findElement(By.id("LoginForm_username")).
sendKeys("admin");
driver.findElement(By.id("LoginForm_password")).
sendKeys("123456");
driver.findElement(By.id("SubmitLoginBTN")).
click();
Thread.sleep(3000);
driver.findElement(By.partialLinkText("新建 Bug")).
click();
Thread.sleep(3000);
// 打印title,查看当前焦点的位置在哪个页面
System.out.println(driver.getTitle());
// 切换窗口
System.out.println(driver.getWindowHandle());
Set<String> windows=driver.getWindowHandles();
for(String win:windows) {
driver.switchTo().window(win);
String current_title=driver.getTitle();
if(current_title.contains("新建Bug")) {
driver.findElement(By.id("BugInfoView_title"))
.sendKeys("缺陷1");
}
}
Thread.sleep(6000);
driver.quit();
}
}
常见控件操作
下拉框操作:
//下拉列表框的操作
WebElement selectSingle=driver.findElement(By.name("fruit"));
Select f1=new Select(selectSingle);
//三种定位方式
f1.selectByIndex(0);
f1.selectByValue("pear");
f1.selectByVisibleText("1苹果");
//是否多选
System.out.println(f1.isMultiple());
System.out.println(f1.getFistSelectedOption().getText());
多选列表的操作:
WebElement selectMul=driver.findElement(By.name("hobby"));
Select f2=new Select(selectMul);
f2.selectByIndex(0);
f2.selectByValue("tour");
f2.selectByVisibleText("2阅读");
//取消选择
f2.deselectAll();
System.out.println(f2.isMultiple());
单选框/复选框的操作
//点击单选框
WebElement element=driver.findElement(By.xpath("//input[@value='orange']"));
if(element.isSelected()){
element.click();
}
//遍历的方式点击所有的name为f1复选框
List<WebElement>fruit=driver.findElements(By.name("f1"));
for(WebElement f:fruit){
f.click();
}
练习:
public class ElementDemo4 {
public static void main(String[] args) throws InterruptedException {
String url = "http://localhost:8032/test/04elementdemo.html";
System.setProperty("webdriver.gecko.driver",
"D:\\demo\\demo1\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get(url);
Thread.sleep(3000);
driver.findElement(By.id("input1")).sendKeys("hello");
Thread.sleep(3000);
driver.findElement(By.id("input1")).clear();
//下拉框
WebElement fruit=driver.findElement(By.name("fruit"));
Select s1=new Select(fruit);
s1.selectByIndex(3);//4
s1.selectByValue("pear");
s1.selectByVisibleText("3Ьвзг");
System.out.println(s1.isMultiple());
//多选框
WebElement hobby=driver.findElement(By.name("hobby"));
Select s2=new Select(hobby);
s2.selectByValue("reading");
s2.selectByVisibleText("1дЫЖЏ");
s2.deselectByValue("reading");
System.out.println(s2.isMultiple());
//选中所有input框的内容,这里写个循环更好。
driver.findElement(By.xpath("//input[@value='orange']"))
.click();
// driver.findElement(By.xpath("//input[@value='berry1']")).click();
// driver.findElement(By.xpath("//input[@value='watermelon1']")).click();
// driver.findElement(By.xpath("//input[@value='orange1']")).click();
//循环操作实现:
Set<WebElement>elements=driver.findElements(By.xpath("//input[@*]"));
for(WebElement element:elements){
element.click;
}
//结束
Thread.sleep(5000);
driver.quit();
}
}
检查文本内容是否出现
//获取某元素的文本信息
String a=driver.findElement(By.tagName("P")).getText();
System.out.println(a);