木子-后端-webdriver selenium的使用方法(仅自己的个人理解)

本文详细介绍如何使用Selenium进行网页自动化操作,包括模拟用户行为、页面元素定位及数据爬取等核心功能。此外,还提供了常见问题解决方案及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下在我的理解中这个有什么用

1、可以模拟真人操作页面执行点击,插入数据,跳转页面保存信息

2、可以从页面爬取数据

 

缺点:这个很吃服务端的网速的。。比如我模拟点击一个页面,点击后就需要获取页面的id,class等数据,如果页面开启很慢或者页面加载速度很慢,我明明进入了页面,但是页面还是白屏,说明页面没加载完成,这个时候它就找不到我需要的id或者class就会直接报错,所以我使用这个就总是加延时,还加了递归每间隔几秒查询一次有没有这个id,class

 

开始进入正式笔记阶段,本人使用的是火狐的插件,我会在下面展示重要的部分代码,并标明注释(插件百度一下就有各个版本,谷歌,火狐,IE等等,不通用,谷歌只能调用谷歌浏览器,火狐只能调用火狐浏览器)

1、向别人的浏览器存入数据(也可以用于爬取,但是仅有getText和几个个别方法获取页面信息,所以我就自己理解为向别人存数据是使用)

// todo 这是整个流程的第一步,声明一个WebDriver对象,此对象的作用就是,我在这个里写了跳转iframe页面,那么这个webDriver就表示是这个iframe,可以理解为一个对象
WebDriver webDriver = null;



// todo 后面的驱动位置 是自己本地真实位置 需要自己修改,想让项目自动打开浏览器,也是需要驱动的,
第一个参数是表示火狐的启动,第二个参数就是我的驱动所在位置,每一个驱动的插件不同,需要自己去下
System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");



// todo 经过上一步,如果调用成功,那么页面就已经打开成功了,当前步骤表示,webDriver就是这个火狐
webDriver = new FirefoxDriver();



// todo 表示你需要跳转的页面路径
webDriver.get("http://xxxxxxxxxxx.com");



// todo 遣散现有警告框(自己用到了,所以顺手记录)
webDriver.switchTo().alert().dismiss();



// todo 当前页面最大化(浏览器初次打开是小窗口)
webDriver.manage().window().maximize();




// todo 现在假设我们已经进入了登录页面了,第一步是我们需要输入账号密码
// todo 其中这个name是我们提前F12找到的,WebElement表示一个对象,将页面的name整体模拟成一个对象
WebElement check = webDriver.findElement(By.id("name"));




// todo 这个是点击事件,点击事件有多种,这种是模拟点击,还有一种是模仿鼠标点击
// todo 当前步骤,就等同于我们用鼠标点击一下输入框,获得焦点
check.click();




// todo 此步骤就等同于输入账号,sendKeys表示输入的意思
check.sendKeys("张三");
check.clear();//清除内容信息


// todo 下列方法表示查找整个页面有一个文字叫做“这个作者好帅”的标签
check = webDriver.findElement(By.linkText("这个作者好帅"));



// todo 本人常用的方法就在下方,往下慢慢看有的会有调用方式
By.id("");//根据ID查找
By.className("");//根据class查找
By.xpath("");//根据xpath地址查找(这个不理解的可以百度,同时在开发者模式下也可以直接在浏览器复制,最下面有我的常用)
By.tagName("");//根据tag的标签查找,例如tr,td,table
By.linkText("")//根据文字查找



// todo 跳转iframe页面通过xpath,因为我爬取的页面,iframe没有ID,只能出此下策
iframe = webDriver.findElement(By.xpath("/html/body/div[2]/iframe"));



// todo 将webDriver对象切换为对应iframe(如果你要操作iframe此方法必写)
webDriver.switchTo().frame(iframe);


// todo 切换回父页面  此切换表示回到最底层的父页面,比如你要是开启了2层iframe并且要调用第一层
iframe,那么你就需要调用,上上一步,上一步,重新进入第一层
webDriver.switchTo().defaultContent();



// todo 模拟真实鼠标点击,有的时候直接click方法无效,就需用到此方法(这只是单击事件,还有很多)
WebElement check = webDriver.findElement(By.xpath("//*[@id=\"fui-form\"]/a"));
Actions action = new Actions(webDriver);
action.clickAndHold(check).perform();
action.release().perform();

// todo 模拟回车事件(此功能一般用在跳转页面上,比如跳转页面没有点击下一页功能,但是输入页数的文本框上有回车事件的)
WebElement check = webDriver.findElement(By.xpath("//*[@class=\"el-pagination__jump\"]/div/input"));
check.clear();
check.sendKeys("要跳转的页数");
check.sendKeys(Keys.ENTER);

// todo 最后一步 关闭页面
webDriver.quit();





// todo xpath 的其他使用技巧

1、这个是获取页面上class是sss的上级标签信息,因为class可能有多个所以使用findElements
List<WebElement>list=webDriver.findElements(By.xpath("//*[@class=\"sss\"]/.."));
由于获取到是一个集合的对象,自然可以取到这个单独的对象
WebElement a=list.get(0);
如果要获取某一个属性
String id = a.getAttribute("id");


2、这个是ID的,一个是获取ss的标签路径,一个是获取ss下的第二个(忘了。。下标是从0还是1开始了)
DIV下的A标签(如果标签下只有一个DIV就不需要加下标,如第三行)
By.xpath("//*[@id=\"ss\"]")
By.xpath("//*[@id=\"ss\"]/div[2]/a")
By.xpath("//*[@id=\"ss\"]/div/a")
By.xpath("//*[@id=\"ss\"]/div/a[last()]"));//获取最后一条的

3、 此方法是获取a标签的文字
String text = webDriver.findElement(By.xpath("//*[@id=\"ss\"]/div[2]/a")).getText();

4、这个是获取sss下的div下的table下的tbody下的所有tr
List<WebElement>list = webDriver.findElement(By.xpath("//*[@id=\"sss\"]/div/table/tbody")).findElements(By.tagName("tr"));

2、是将调用请求获取到参数然后存到自己的数据库内(登录部分就不写了,直接写调用部分

// todo 由于部分原因,就不展示访问路径了,用百度代替
// todo 当前步骤是访问这个连接,如果有返回值的数据,那么返回数据会展示在页面上
webDriver.get("http://www.baidu.com");
// todo 延时。。。我怕有的时候请求时间过长,加的,建议加一下
Thread.sleep(5000);

// todo 将获取到的json数据转换成String类型同时移除数据上的无用页面标签,
// todo asciiToNative方法我会在下一个代码块里写  
// todo 因为通过这个请求到的是在页面上,拿取的数据自然是携带了html标签
String text = asciiToNative(webDriver.getPageSource().replaceAll("</pre></body></html>", "").replaceAll("<html><head><link rel=\"stylesheet\" href=\"resource://content-accessible/plaintext.css\"></head><body><pre>", ""));

// todo 解析为一个Json对象
JSONObject jsStr = JSONObject.parseObject(text);

// todo 根据自己的实际需要参数获取。。比如我这里需要取到参数内的controls对象下的参数
Map<String, Object> map = (Map<String, Object>) jsStr.getJSONArray("controls").get(0);


// todo 这个。。。怎么说呢这个是配合第一步用的,根据情况而定,我这边请求是传的一个对象到后台,
// todo 然后传值方式是 url参数部分转码了所以顺手抄上来了,比如路径是http://www.baidu.com?name=%22%2%3A
// todo 这种样式,转成我们看的懂得就是http://www.baidu.com?name=[{name:'张三'}]
// todo (忘了。。大致意思就是将对象类型转码)
String url= URLEncoder.encode("参数","UTF-8")
 ## 最后这个是获取到Json数据转成String ,上一个代码块有调用
   /**
     * 将访问html数据转成json需要的String类型
     * @param asciicode
     * @return
     */
    public String asciiToNative ( String asciicode )
    {
        String[] asciis = asciicode.split ("\\\\u");
        String nativeValue = asciis[0];
        try
        {
            for ( int i = 1; i < asciis.length; i++ )
            {
                String code = asciis[i];
                nativeValue += (char) Integer.parseInt (code.substring (0, 4), 16);
                if (code.length () > 4)
                {
                    nativeValue += code.substring (4, code.length ());
                }
            }
        }
        catch (NumberFormatException e)
        {
            return asciicode;
        }
        return nativeValue;
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值