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

2024-03-27 07:36

本文主要是介绍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 自动化和其它技术,共同学习共同成长!

这篇关于Selenium 自动化 —— 实战篇之自动登录163邮箱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851366

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

BIRT 报表的自动化测试

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例 BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性 -------

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

Shell脚本实现自动登录服务器

1.登录脚本 login_server.sh #!/bin/bash# ReferenceLink:https://yq.aliyun.com/articles/516347#show all host infos of serverList.txtif [[ -f ./serverList.txt ]]thenhostNum=`cat ./serverList.txt | wc -l`e

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env