Java 使用Selenium浏览器自动化

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"));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不努力谁会可怜你?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值