Selenium用法详解【窗口表单切换】【JAVA爬虫】

news/2024/7/19 11:37:41 标签: eclipse, selenium, 爬虫, 测试工具

简介

本文主要讲解java 代码利用Selenium如何实现控制浏览器进行窗口切换和页面内的不同表单之间的切换操作。

切换操作

窗口切换

selenium 操作页面的时候,可能会因为点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时候 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。

窗口切换需要使用 switch_to.windows() 方法。

首先我们先看看下面的代码。

代码流程:先进入 【CSDN首页】,保存当前页面的句柄,然后再点击头条的首篇文章,跳转进入新的标签页,再次保存页面的句柄,我们验证一下 selenium 会不会自动定位到新打开的窗口。


import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;

import java.io.IOException;

public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";


    public static void main(String[] args) throws InterruptedException, IOException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //进入csdn首页
        driver.get("https://www.csdn.net/");
        Thread.sleep(1000);
        //定位头条元素
        WebElement element=driver.findElement(By.xpath("//div[@class='headlines-left']/dl/dt/a"));
        //点击进入头条
        element.click();
        //获取当前窗口句柄
        System.out.println(driver.getWindowHandle());
        //获取所有窗口句柄
        System.out.println(driver.getWindowHandles());
    }
}

HANDLE:句柄,是Windows用来表示对象的

可以看到第一个列表 WindowHandle 是相同的,说明 selenium 实际操作的还是 CSDN首页 ,并未切换到新页面。

下面使用 switchTo().window() 进行切换。

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";


    public static void main(String[] args) throws InterruptedException, IOException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //进入csdn首页
        driver.get("https://www.csdn.net/");
        Thread.sleep(1000);
        //定位头条元素
        WebElement element=driver.findElement(By.xpath("//div[@class='headlines-left']/dl/dt/a"));
        //点击进入头条
        element.click();
        //获取当前窗口
        System.out.println(driver.getWindowHandle());
        //获取所有窗口
        System.out.println(driver.getWindowHandles());
        List<String> windows= new ArrayList<>(driver.getWindowHandles());
         driver.switchTo().window(windows.get(windows.size()-1));
        //获取当前窗口
        System.out.println(driver.getWindowHandle());
    }
}

上面代码在点击跳转后,使用 switchTo 切换窗口,getWindowHandles 返回的 handle 列表是按照页面出现时间进行排序的,最新打开的页面肯定是最后一个,这样用 windows.get(windows.size()-1)即可跳转到最新打开的页面了。

那如果打开的窗口有多个,如何跳转到之前打开的窗口,如果确实有这个需求,那么打开窗口是就需要记录每一个窗口的 key(别名)value(handle),保存到字典中,后续根据 key 来取 handle

表单切换

很多页面也会用带 frame/iframe 表单嵌套,对于这种内嵌的页面 selenium 是无法直接定位的,需要使用 switchTo().frame() 方法将当前操作的对象切换成 frame/iframe 内嵌的页面。

switchTo().frame() 默认可以用的 idname 属性直接定位,但如果 iframe 没有 idname ,这时就需要使用 xpath 进行定位。下面先写一个包含 iframe 的页面做测试用。

A:<iframe id="index" name="home" src="/main.html" frameborder="0" scrolling="auto" ></iframe>
B:<iframe id="baidu" name="baidu" src="http://www.baidu.com" frameborder="0" scrolling="auto" ></iframe>
  //根据排序定位frame切换
  driver.switchTo().frame(1);
 //根据frame的name或者id定位切换
  driver.switchTo().frame("baidu");

frame表单切换,在以前前端没有分离前还是经常见到的,自从前后端分离后,前端技术发生大变化,如今用frame的页面已经很少见,出来用switchTo().frame() 切换换外,我们也可以通过元素定位点击时间进行切换,到达了灵活使用的目的。


http://www.niftyadmin.cn/n/25152.html

相关文章

【华为OD机试真题2023 JAVA】微服务的集成测试

华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 微服务的集成测试 知识点深搜 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次服务自身启动加载会消耗一些时间。 给你一个…

Apifox调用Security权限接口

Apifox调用Security权限接口1. SpringBoot3.0集成SpringSecurity1.1 pom1.2 properties配置2. Apifox 配置2.1 配置根目录Auth2.2 ApiFox 分享调用本地接口本教程环境&#xff1a; Apifox&#xff1a;2.2.14 &#xff08;建议更新到最新版本&#xff0c;老版本Auth从父级继承可…

【模板初阶】

目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.4.1 隐式实例化 2.4.2 显式实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 4 总结 1. 泛型编程 如何实现一个通用的…

多线程(4)

文章目录1.单例模式2. 阻塞队列3. 定时器4.线程池前言 :   前面的一些文章&#xff0c;我们已经将有关多线的基础知识了解了&#xff0c; 下面我们来写一些关于多线程的代码案例&#xff0c;来强化对多线程的理解&#xff0c;另外通过这些案例补充一下其他方面的知识。 1.单例…

基于imx6ull第一个Linux驱动

在编译第一个驱动之前&#xff0c;需要把基本的环境准备好&#xff0c;可以参照这两篇文章&#xff1a;https://wlink.blog.csdn.net/article/details/128590747https://wlink.blog.csdn.net/article/details/128591216我们之前写过一个基于ubuntu最基本的字符设备驱动&#xf…

AI面试数据算法、NLP、推荐系统等理论知识汇总

本文的面试&理论知识分为两个部分&#xff1a; 1、数据结构算法之排序算法 2、NLP和推荐系统相关理论知识 人工智能相关岗位面试&#xff0c;算法题是必不可少的一关&#xff0c;因为这是一个AI学者的基本功&#xff0c;很多知识是无法突击准备学习的。所以今天给大家总…

【前端】Vuex模块化和持久化应用示例

1. 概述 Vuex作为VUE状态管理组件&#xff0c;能够将项目中公共数据状态进行统一管理&#xff0c;并且可以按照不同的业务功能将数据状态分模块管理&#xff0c;即数据状态模块化。 另外&#xff0c;对于网页刷新导致Vuex状态丢失的问题可以使用vuex-persistedstate插件配置将…

Java设计模式-单例模式

介绍 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法(静态方法)。 比如 Hibernate 的 SessionFactory&#xff0c;它充当数据存储源的代理&#xff0…