Selenium 自动化 —— 实战篇之自动登录163邮箱

Selenium 自动化专栏系列文章

  • (一)入门和 Hello World 实例
  • (二)使用WebDriverManager自动下载驱动
  • (三)Selenium IDE录制、回放、导出Java源码
  • (四)浏览器窗口操作
  • (五)切换浏览器窗口
  • (六)定位页面元素

前面的系列文章已经对 WebDriver 驱动管理、浏览器窗口操作、页面元素定位等部分的知识进行了介绍,本篇文章,我们利用前面学过的知识,来写一个完整的程序,实现163邮箱的自动登录!
在这里插入图片描述

1. 创建工程

我们使用的是maven工程的项目,所以在pom.xml中引入相关的依赖:

  • Selenium 包
  • 自动下载驱动的WebDriverManager
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version>
</dependency>
<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.7.0</version>
</dependency>`

2. 编写程序框架

接下来,我们在main方法中对WebDriver进行了初始化操作,并且写了一个空方法 login163Mail(),我们用 Selenium 登录163邮箱会在这里实现。

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class Mail163LoginTest {private static WebDriver driver;public static void main(String[] args) {// 自动下载和配置驱动WebDriverManager.chromedriver().setup();driver = new ChromeDriver();login163Mail();driver.quit();}public static void login163Mail(){}
}

3. 定位页面元素

在实现爬虫之前,我们需要对163邮箱的网页中的元素进行研究,这样后面我们才能用 Selenium 模拟登录的操作。

首先邮箱登录的URL是:https://mail.163.com/
打开网页后,我们主要关注的是下面这个登录表单,尤其是3个HTML元素:

  1. 账号文本框
  2. 密码文本框
  3. 登录按钮
    在这里插入图片描述
    在登录页右键,选中“Inspect”或者“检查”,进入网页调试控制台。
    在这里插入图片描述
    点击控制台左上角的“选中元素”图标,再点击“邮箱账号”文本框,控制台中的源码就自动定位到了账号文本框了。
    在这里插入图片描述
    看到这个input元素,我们就可以利用前一篇文章学到的《元素定位》找到这个账号文本框。
<input data-placeholder="邮箱账号或手机号码" name="email" 
data-type="email" data-loginname="loginEmail" 
data-required="true" class="j-inputtext dlemail j-nameforslide" 
type="text" autocomplete="off" tabindex="1" spellcheck="false" 
id="auto-id-1711460225439" placeholder="邮箱账号或手机号码" 
style="width: 236px;">

我们可以用id、name或其它属性,但是这里的id是自动生成的下次可能会变,所以我们用可读性更好的 name 属性来定位。

WebElement emailEle = driver.findElement(By.name("email"));

找到账号文本框后,我们需要在文本框中输入我们的账号,这里我们使用的是 sendKeys 方法:

emailEle.sendKeys("your_username");

密码框同样的处理!

WebElement passwordEle = driver.findElement(By.name("password"));
passwordEle.sendKeys("your_password");

接下来,我们需要定位 “登录” 按钮,同样使用元素定位器。

<a href="javascript:void(0);" id="dologin" data-action="dologin" 
class="u-loginbtn btncolor tabfocus btndisabled" tabindex="8">&nbsp;&nbsp;</a>

这里我们可以用id做选择器:

WebElement loginBtn = driver.findElement(By.id("dologin"));

然后,我们使用元素的 click() 方法点击这个登录按钮。

loginBtn.click();

这样,我们就完成了账号、密码的输入,和登录按钮的点击。

4. 完善登录代码

经过前面的分析,我们可以得到下面的完整代码:

public static void login163Mail() throws InterruptedException {// 打开登录页String url = "https://mail.163.com/";driver.get(url);// 输入账号WebElement emailEle = driver.findElement(By.name("email"));emailEle.sendKeys("your_username");// 输入密码WebElement passwordEle = driver.findElement(By.name("password"));passwordEle.sendKeys("your_password");// 点击登录WebElement loginBtn = driver.findElement(By.id("dologin"));loginBtn.click();TimeUnit.SECONDS.sleep(5);
}

这也太简单了吧。
我们运行一下我们的测试类。

不幸的是,代码没有像我们臆想中的那么顺利,运行程序,结果报错了:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: 
Unable to locate element: {"method":"css selector","selector":"*[name='email']"}

显而易见,没有找到邮箱文本框元素。

5. 为什么不能定位到元素

我们的账号文本框的name的确是“email”,这没有搞错,为什么却定位不到这个元素呢?

观察网页的整体结构:
在这里插入图片描述
我们发现,登录框居然是在一个 iframe 里面。

在Selenium中,要定位iframe里面的元素,你首先需要将webdriver 切换到对应的iframe中
这是因为iframe是一个内联框架,它将另一个HTML页面嵌入到当前页面中,Selenium默认不能直接访问iframe内的元素。

6. 切换到iframe

在我们这个系列之前的文章介绍过,浏览器窗口的切换方法,其实iframe的切换也类似。
有几种方式切换到iframe:

driver.switchTo().frame(0);     // 通过下标
driver.switchTo().frame("XXX"); // 通过name
driver.switchTo().frame("YYY"); // 通过id

因为登录页只有一个iframe,我们直接通过下标切换iframe,这样就简单。

7. 运行代码

完善后的代码如下,需要注意的是,你需要把下面的内容替换成你真实的账号、密码。

public static void login163Mail() throws InterruptedException {// 打开登录页String url = "https://mail.163.com/";driver.get(url);// 切换到登录框的iframedriver.switchTo().frame(0);// 输入账号WebElement emailEle = driver.findElement(By.name("email"));emailEle.sendKeys("your_username");// 输入密码WebElement passwordEle = driver.findElement(By.name("password"));passwordEle.sendKeys("your_password");// 点击登录WebElement loginBtn = driver.findElement(By.id("dologin"));loginBtn.click();TimeUnit.SECONDS.sleep(10);
}

然后,我们运行程序,发现很完美!、

登录页自动输入账号、密码
在这里插入图片描述

自动点击登录按钮后,成功登录到163邮箱。
在这里插入图片描述

8. 完整代码

完整代码如下:

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.util.concurrent.TimeUnit;public class Mail163LoginTest {private static WebDriver driver;public static void main(String[] args) throws InterruptedException {// 自动下载和配置驱动WebDriverManager.chromedriver().setup();driver = new ChromeDriver();login163Mail();driver.quit();}public static void login163Mail() throws InterruptedException {// 打开登录页String url = "https://mail.163.com/";driver.get(url);// 切换到登录框的iframedriver.switchTo().frame(0);// 输入账号WebElement emailEle = driver.findElement(By.name("email"));emailEle.sendKeys("abc@163.com");// 输入密码WebElement passwordEle = driver.findElement(By.name("password"));passwordEle.sendKeys("123456");// 点击登录WebElement loginBtn = driver.findElement(By.id("dologin"));loginBtn.click();TimeUnit.SECONDS.sleep(10);}
}

相关的依赖定义在 pom.xml 中:

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version>
</dependency><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.7.0</version>
</dependency>

到这里,我们就用 Selenium 完成了163邮箱的自动登录。是不是非常简单呢!所以不妨动手运行一下上面的例子,你会真正的体验到 Selenium 的强大。

关注我的博客CSDN - 兰亭序咖啡,和我一起学习探讨 Selenium 自动化和其它技术,共同学习共同成长!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)

AI时代-普通人的AI绘画工具对比&#xff08;Midjouney与Stable Diffusion&#xff09; 前言1、基础对比Stable Diffusion&#xff08;SD&#xff09;SD界面安装与使用SD Midjouney&#xff08;MJ&#xff09; 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…

Linux实现m4a格式转换为wav格式

需要在linux上安装ffmpeg 参考博客 Linux上安装ffmpeg修改环境变量【这一点很重要&#xff0c;自己因为没有添加环境变量&#xff0c;捣鼓了很长时间】 将ffmpeg的绝对路径添加到 PATH 环境变量中&#xff0c;以让系统能找到ffmpeg的安装路径。 # /home//project/ffmpeg-6.1-a…

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件&#xff0c;这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

在 Code Review 中寻找什么?

当你审查别人的代码时&#xff0c;你会寻找什么&#xff1f; 无论你是通过像 Upsource 这样的工具来审查代码&#xff0c;还是在同事讲解他们代码的过程中进行审查&#xff0c;在任何情况下&#xff0c;有些事情都比其他事情更容易评论。比如&#xff1a; 格式&#xff1a;空…

PCA+DBO+DBSCN聚类,蜣螂优化算法DBO优化DBSCN聚类,适合学习,也适合发paper!

PCADBODBSCN聚类&#xff0c;蜣螂优化算法DBO优化DBSCN聚类&#xff0c;适合学习&#xff0c;也适合发paper&#xff01; 一、蜣螂优化算法 摘要&#xff1a;受蜣螂滚球、跳舞、觅食、偷窃和繁殖等行为的启发&#xff0c;提出了一种新的基于种群的优化算法(Dung Beetle Optim…

zookeeper面试题

文章目录 ZooKeeper 是什么&#xff1f;ZooKeeper 提供什么&#xff1f;1. 文件系统2. 通知机制 ZooKeeper 文件系统四种类型的 znode1. PERSISTENT (持久化目录节点)2. PERSISTENT_SEQUENTIAL (持久化顺序编号目录节点)3. EPHEMERAL (临时目录节点)4. EPHEMERAL_SEQUENTIAL (临…

GIMP - GNU 图像处理程序 - 工具栏窗口 (Toolbox) 显示

GIMP - GNU 图像处理程序 - 工具栏窗口 [Toolbox] 显示 1. File -> Open2. GIMP 主面板里&#xff0c;右击弹出菜单 -> Tools -> New Toolbox3. Windows -> Dockable Dialogs -> Tool Options4. 工具选项拖动到工具箱里面5. Always On TopReferences GIMP 是跨平…

sqlite3嵌入式开发板命令行方式使用

如何在编译嵌入式版本的sqlite3&#xff0c;请看我上一篇文章 sqlite3 交叉编译-CSDN博客 一、sqlite3命令行方式使用 假如我将编译好的嵌入式的sqlite3放置在如下路径&#xff1a; 进入bin目录进行操作 1.运行sqlite3 运行sqlite3有两种方式 1&#xff09;直接在内存里面…

Django——Ajax请求

Django——Ajax请求 一、响应 Json 数据 path(str/ , views.str_view), path(json/ , views.json_view), path(jsonresponse/ , views.jsonresponse_view), path(ls/ , views.ls),from django.shortcuts import render , HttpResponse from django.http import JsonResponse …

文心一言指令词宝典之职场效率篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

基于SpringBoot和Vue的车辆管理系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的车辆管理系统的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f…

设计模式(3):工厂模式

一.工厂模式 实现了创建者和调用者的分离。 二.分类 简单工厂模式 用来生产同一等级结构中的任意产品。(对于新增产品&#xff0c;需要修改已有代码。用的最多&#xff09; 要点: 简单工厂模式也叫静态工厂模式&#xff0c;就是工厂类一般是使用静态方法&#xff0c;通过接收…

Git相关命令(二)

三、Team协作 分支概念&#xff1a;由于多人贡献于同一个仓库&#xff0c;但是又不能同时直接再仓库上修改&#xff0c;所以就需要从主仓库分支&#xff0c;每个人在自己对应的分支上操作&#xff0c;最后在合并到主仓库即可 1、fork 仓库。这是 github 的操作&#xff0c;而…

【Java面试题】操作系统

文章目录 1.进程/线程/协程1.1辨别进程和线程的异同1.2优缺点1.2.1进程1.2.2线程 1.3进程/线程之间通信的方法1.3.1进程之间通信的方法1.3.2线程之间通信的方法 1.4什么是线程上下文切换1.5协程1.5.1协程的定义&#xff1f;1.5.2使用协程的原因&#xff1f;1.5.3协程的优缺点&a…

Android-AR眼镜屏幕显示

Android-AR眼镜 前提&#xff1a;Android手持设备 需要具备DP高清口 1、创建Presentation&#xff08;双屏异显&#xff09; public class MyPresentation extends Presentation {private PreviewSingleBinding binding;private ScanActivity activity;public MyPresentatio…

后缀名是safetensors和pt、h5有什么区别

后缀名为.safetensors、.pt&#xff08;PyTorch tensor&#xff09;和.h5&#xff08;HDF5&#xff09;的文件都是用于存储深度学习模型的文件格式&#xff0c;但它们在设计目的、压缩效率、安全性和兼容性方面有所不同。 .safetensors 设计目的&#xff1a;.safetensors格式专…

大模型如何通过token进行推理?

大型模型通过token进行推理的过程通常涉及以下步骤&#xff1a; 1、Tokenization&#xff08;分词&#xff09;&#xff1a;首先&#xff0c;输入文本或序列被分割成tokens&#xff0c;这些tokens通常是单词、子词或字符的序列。这一步通常由预训练模型的tokenizers完成。 2、…

计算机网络:物理层 - 编码与调制

计算机网络&#xff1a;物理层 - 编码与调制 基本概念编码不归零制编码归零制编码曼彻斯特编码差分曼彻斯特编码 调制调幅调频调相混合调制 基本概念 在计算机网络中&#xff0c;计算机需要处理和传输用户的文字、图片、音频和视频&#xff0c;他们可以统称为消息数据&#xf…

[GXYCTF2019]StrongestMind

web请求类题目&#xff0c;要求1000次 import requests from bs4 import BeautifulSoup import time urlhttp://ad7bc925-bc7a-4881-8a75-9045b60d4ab2.node5.buuoj.cn:81/index.php srequests.session() #维持会话 datas.get(url) for i in range(1001):soupBeautifulSoup(d…

探究 HTTPS 的工作过程

目录 1. HTTPS 协议原理 1.1. 为什么要有HTTPS协议 1.2. 如何理解安全 1.3. HTTPS 协议是什么 2. HTTPS 的前置概念 2.1. 什么是加密 && 解密 2.2. 为什么要加密 2.3. 常见的加密方式 2.3.1. 对称加密 2.3.2. 非对称加密 2.4. 数据摘要 && 数据指纹…