1元素定位
1.1cssSelector
单个类
List<WebElement> elements = driver.findElements(By.cssSelector(".webcast-chatroom___items"));
多个类
driver.findElement(By.cssSelector("[class='btn btn-brand search-btn header-search-btn-78']")).click();
单个ID
List<WebElement> elements = driver.findElements(By.cssSelector("#idname"));
1.2xpath
通过属性
driver.findElement(By.xpath("//input[@placeholder='请输入您要搜索的商品、类目或链接']")).clear();
通过文字
driver.findElement(By.xpath("//span[text()=’搜索’]"); //全部文字
driver.findElement(By.xpath("//button[contains(text(), ’搜索’)]"); //部分文字
父定位子
<html>
<body>
<div id="parent">
parent
<div id="A"> old brother</div>
<div id="B"> child</div>
<div id="C"> litter brother</div>
</div>
</body>
</html>
子定位父
print driver.find_element_by_xpath("//div[@id='parent']/div[2]").text #child
print driver.find_element_by_xpath("//div[@id='parent']/div[@id='B']").text #child
子定位父
print driver.find_element_by_xpath("//div[@id='B']/..").text #parent
定位兄弟
print driver.find_element_by_xpath("//div[@id='B']/../div[1]").text #old brother
print driver.find_element_by_xpath("//div[@id='B']/../div[3]").text #litter brother
1.3窗口
// 得到所有窗口句柄
Set<String> handles = driver.getWindowHandles();
//获取当前窗口的句柄
String currentHandle = driver.getWindowHandle();
for (String handler : handles) {
if(currentHandle.equals(handler)) {
continue;
}
//进入新选项卡
driver.switchTo().window(handler);
}
1.4进出Iframe
每当进去的时候操作完毕就需要退出才能操作原来的窗口下的元素
id
// 进入 id 叫frameA 的 iframe
dr.switchTo().frame("frameA");
// 回到主窗口
dr.switchTo().defaultContent();
name
// 进入 iframe的name属性等于iframeA的iframe 叫frameA 的 iframe
dr.switchTo().frame("frameA");
// 回到主窗口
dr.switchTo().defaultContent();
1.5等待元素出现
WebDriverWait wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("d111112")));
2删除元素
2.1删除被选中的元素
//按 id 获取要删除的元素; 让 “要删除的元素” 的 “父元素” 删除 “要删除的元素”
String js = "var elem = document.getElementsByClassName('toolsbar').item(0);elem.parentNode.removeChild(elem);";
((JavascriptExecutor) driver).executeScript(js);
2.2删除父元素下所有子元素
比如
<div id="ok">
<button tpye='button'>111111</button>
<p>22222</p>
<div> <p>31232</p> </div>
</div>
document.getElementById("ok").innerHTML = "";
3执行脚本
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("window.location='https://pub.alimama.com/promo/search/index.htm';");
3.1操作cookie
添加
driver.manage().addCookie(new Cookie("username", "19828659485", "/", null));
driver.manage().addCookie(new Cookie("password", "WangWei6", "/", null));
获取
String name = driver.manage().getCookieNamed("username").getValue();
删除
driver.manage().deleteCookieNamed("password");
结果
3.2滚动屏幕加载元素
举例
FirefoxDriver driver = new FirefoxDriver();
driver.get("https://www.hao123.com/");
JavascriptExecutor js = (JavascriptExecutor)driver;
//循环下拉
/*for (int i = 0; i < 10; i++) {
js.executeScript("scrollTo(0,"+(i * 500)+")");
waitTime(2000);
}*/
//下拉500
js.executeScript("scrollTo(0,500)");
更多
//移动到元素element对象的“顶端”与当前窗口的“顶部”对齐
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
//移动到元素element对象的“底端”与当前窗口的“底部”对齐
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(false);", element);
//移动到页面最底部
((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight)");
//移动到指定的坐标(相对当前的坐标移动)
((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 700)");
Thread.sleep(3000);
//结合上面的scrollBy语句,相当于移动到700+800=1600像素位置
((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 800)");
//移动到窗口绝对位置坐标,如下移动到纵坐标1600像素位置
((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 1600)");
Thread.sleep(3000);
//结合上面的scrollTo语句,仍然移动到纵坐标1200像素位置
((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 1200)");
3.3改变元素属性
隐藏
1、元素被设为hiden。
这个链接是隐藏的,但是能用js点到访问百度
2、display : none。
方案
执行js改变该元素的样式为block即可。
driver.get("https://www.baidu.com");
try {
Thread.sleep(2000);
String js = "document.getElementById('s-user-setting-menu').style = 'display: block; right: 75px;'";
((JavascriptExecutor) driver).executeScript(js);
Thread.sleep(3000);
driver.findElement(By.xpath("//a[text()='关闭热榜']")).click();
}catch (Exception e){
log.error(e.getMessage());
}
通过class
String js = "document.getElementsByClassName('s-top-userset-menu c-floating-box c-font-normal').item(0).style = 'display: block; right: 75px;'";
4环境搭建
4.1下载软件
jdk1.8、maven3.5.6、selenium3.14.0、guava23.0、google chrome 109.0.5414.120、ChromeDriver 109.0.5414.74
驱动与浏览器版本对应:ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)
下载对应的selenium:Maven Repository: org.seleniumhq.selenium » selenium-java (mvnrepository.com)
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.14.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
4.2安装谷歌浏览器
安装谷歌到默认路径
关闭谷歌浏览器自动更新
4.3安装浏览器驱动
4.4代码测试
package com.zlxt.mysingle.module.douyin;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class T2 {
public static void main(String[] args) throws Exception {
//D://chromedriver.exe 以实际存储路径为准
System.setProperty("webdriver.chrome.driver", "D:\\Selenum\\chromedriver.exe");
ChromeOptions chromeOptions = new ChromeOptions();
ChromeDriver driver = new ChromeDriver(chromeOptions);
// 窗口最大化
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Thread.sleep(1000);
//进入百度首页
driver.get("https://www.baidu.com/");
Thread.sleep(3000);
WebElement element = driver.findElement(By.cssSelector("#result_logo")).findElement(By.cssSelector(".index-logo-src"));
System.out.println(element.getAttribute("alt"));
}
}