[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

2023-11-10

        前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能。而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容。
        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~

         [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)
         [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium
        [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图
        注意:好像访问浏览器在C盘会自动生成文件越来越小,但可以清理,不知道为啥?


一. Selenium自动登录

        代码如下所示:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

#模拟登陆163邮箱
driver = webdriver.Firefox()
driver.get("http://mail.163.com/")

#用户名 密码
elem_user = driver.find_element_by_name("username")
elem_user.send_keys("15201615157")
elem_pwd = driver.find_element_by_name("password")
elem_pwd.send_keys("********")
elem_pwd.send_keys(Keys.RETURN)
time.sleep(5)
assert "baidu" in driver.title
driver.close()
driver.quit()
        运行结果如下图所示,自动打开Firefox浏览器并输入用户名和密码实现邮箱登录。



        代码非常简单,其中的原理也很简单:通过driver访问Firefox浏览器及URL,同时find_element_by_name找到网页HTML源代码中对应的值并填充,最后调用Keys实现模拟操作键盘Keys.RETURN实现。该断言结果是不存在的,主要是用于防止关闭浏览器。
        同时输入用户名或密码错误会提示,其实就是浏览器。

原理解释 
        两年前在学习C#网络编程时,我成写过Winform自动访问163邮箱的文章:

         C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
        通过对比,Python 简短高效 的优势就显示出来的,其中163邮箱登录界面HTML源码也没有修改和修复过,这是我意料之外的。
        其中通过查找该登录页面发现用户名Id为“idInput”,密码Id为“pwdInput”,登录按钮ID为“loginBtn”。如图id和name:
          <input class="" tabindex="1" title="请输入帐号" id="idInput" name="username" type="text" value=""..
          <input class="" tabindex="2" title="请输入密码" id="pwdInput" name="password" type="password" />
          <button id="loginBtn" class="" type="submit">登  录</button>

        如下图所示一目了然:


        这部分文章虽然简单,但是作为基础文章在合适不过了,同时通过webdriver的driver.find_element_by_name引出下面的基础知识介绍,毕竟实践例子才是学习Selenium的动力源泉。
        同样下面这段代码可实现自动登录CSDN,是不是可以通过它实现暴力破解密码呢?
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
driver.get("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn")
elem_user = driver.find_element_by_name("username")
elem_user.send_keys("Eastmount")
elem_pwd = driver.find_element_by_name("password")
elem_pwd.send_keys("********")
elem_pwd.send_keys(Keys.RETURN)
time.sleep(5)
assert "baidu" in driver.title
driver.close()
driver.quit()



二. Locating Elements介绍


        PS:第一次上传翻译博文,如果有错误还请见谅!
        官网地址:http://selenium-python.readthedocs.org/locating-elements.html
        这里有各种策略用于定位网页中的元素(locate elements),你可以选择最适合的方案,Selenium提供了一下方法来定义一个页面中的元素:
  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector
        下面是查找多个元素(这些方法将返回一个列表):
  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector
        除了上面给出的公共方法,这里也有两个在页面对象定位器有用的私有方法。这两个私有方法是find_element和find_elements,用法示例:
from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')
       这些都是通过类可获取的属性:
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

1 Locating By Id

       当你知道一个元素的id属性时使用该功能。有了这个方法,用id属性值匹配时第一个被定位的元素将被返回。如果没有元素匹配id值,一个NoSuchElementException异常将会抛出。例如,参考这个页面源码:

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
  </form>
 </body>
<html>
        表单form元素可以被如下方式定位:
login_form = driver.find_element_by_id('loginForm')

2 Locating By Name

        当你知道一个元素的name属性时使用该方法。通过该方法,第一个满足name属性值的元素将被匹配返回,如果没有元素匹配,将抛出一个NoSuchElementException异常。例如,参考下面源码:

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
   <input name="continue" type="button" value="Clear" />
  </form>
</body>
<html>
        定位username&password元素方法如下:
username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')
        在"Clear"按钮之前会给出"Login"登录按钮:
continue = driver.find_element_by_name('continue')

3 Locating By XPath


        XPath是用于定位XML文档中节点的语言。正如HTML可以是XML(XHTML)的一个实现,Selenium用户可以利用这个强大的语言来跟踪Web应用程序中的元素。XPath扩展已经超出(以及支持)了按照id或name属性定位的简单方法,并开发了各种新的可能,如定位页面上的第三个复选框(checkbox)。
        其中使用XPath的一个主要原因是:当你没有一个合适的ID或Name属性来定位你需要查找的元素时,你可以使用XPath去定位这个绝对元素(不建议这样),或者相对一个有id或name属性的元素定位。XPath定位器也可以通过其他不止是id和name属性进行指定元素。
        绝对XPath包含定位的所有元素,这些元素从根(HTML)到其结果可能会失败,只有稍微调整到应用程序。通过找到附近的一个元素的id或name属性(理想的父元素),你才可以根据之间的关系定位到你追踪的元素。这是不太可能改变的,并且会使你的测试更加的健壮。例如参考下面这段源代码:

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
   <input name="continue" type="button" value="Clear" />
  </form>
</body>
<html>
        这个表单form元素可能通过如下方法被定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
        [1] 绝对路径(如果HTML有稍微的改动,就会被破坏)
        [2] 在HTML中的第一个表单元素
        [3] 指定属性名称为id且值为loginForm的表单元素
        定位username元素的方法如下:

username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
        [1] 第一个form元素通过一个input子元素,name属性和值为username实现
        [2] 通过id=loginForm值的form元素找到第一个input子元素
        [3] 属性名为name且值为username的第一个input元素
         定位"Clear"按钮元素的方法如下:

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
        [1] 属性名为name其值为continue和属性名为type其值为button的Input控件
        [2] 属性id=loginForm的form元素的第四个input子元素
        上面这些例子涉及一些基础知识,更多详情请参考下面的建议:

        这里也有几个非常实用的附加组件,可以帮助发现元素的XPath:
  • XPath Checker - suggests XPath and can be used to test XPath results.
  • Firebug - XPath suggestions are just one of the many powerful features of this very useful add-on.
  • XPath Helper - for Google Chrome

4 Locating Hyperlinks By Link Text


        当你知道一个锚标记内使用链接文本就使用该方法。通过这个策略,第一个匹配这个link text值的元素将被返回。如果没有元素匹配这个链接文本,将抛出一个NoSuchElementException异常。示例的源代码如下:
<html>
 <body>
  <p>Are you sure you want to do this?</p>
  <a href="continue.html">Continue</a>
  <a href="cancel.html">Cancel</a>
</body>
<html>
        这个continue.html链接定位的方法如下,partial表示部分匹配:
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')


5 Locating Elements By Tag Name


        当你想通过tag name(标记名)定位一个元素时可以使用该方法。同样,第一个给出的tag name元素将被返回,如果没有匹配的标记名,将抛出一个NoSuchElementException异常。示例的源代码如下:
<html>
 <body>
  <h1>Welcome</h1>
  <p>Site content goes here.</p>
</body>
<html>
        定位heading(h1)元素的方法如下:
heading1 = driver.find_element_by_tag_name('h1')


6 Locating Elements By Class Name

        介绍类似,用于通过类属性名(class attribute name)进行定位一个元素。示例源代码如下:
<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>
        其中元素"p"的定位方法如下:
content = driver.find_element_by_class_name('content')


7 Locating Elements By CSS Selectors


        当你想要通过CSS选择器语法定位一个元素时,可以使用该方法。它将返回第一个与CSS选择器匹配的元素,如果没有匹配CSS选择器的元素,将返回一个NoSuchElementException异常。实例源代码如下所示:
<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>
        其中元素"p"的定位方法如下:
content = driver.find_element_by_css_selector('p.content')
        Sauce实验室有非常好的关于CSS选择器的文档:
            Sauce Labs has good documentation  on CSS selectors.

      (By:Eastmount 2015-8-21 下午6点   http://blog.csdn.net/eastmount/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍 的相关文章

  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 根据列 value_counts 过滤数据框(pandas)

    我是第一次尝试熊猫 我有一个包含两列的数据框 user id and string 每个 user id 可能有多个字符串 因此会多次出现在数据帧中 我想从中导出另一个数据框 一个只有那些user ids列出至少有 2 个或更多string
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk

随机推荐

  • [YOLO专题-2]:总体-YOLO目标检测的网络总体架构与核心概念

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122118894 目录 前言说明 第1
  • Sqli-labs——lesson11

    在11关是登录界面了 我们可以先用bp抓包来看它的post请求来再在Hackbar里面的post data里面对数据进行操作 1 在对uname的admin加上 后回显错误 说明此处存在注入漏洞 2 首先先在username中验证 用 or
  • matlab读.h5文件

    之前用 python 给 nuswide 提取了 VGG19 特征 因为文件太大 超过 mat 限制 存成 h5 见 1 现在一个 matlab 程序要读 可以用 h5disp 查看 h5 文件内容的结构 各个 datasets 然后用 h
  • DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的区别

    首先 先从基础的东西说起 开发WINDOWS下的驱动程序 需要一个专门的开发包 如 开发JAVA程序 我们可能需要一个JDK 开发WINDOWS应用程序 我们需要WINDOWS的SDK 现在开发WINDOWS下的驱动程序 我们需要一个DDK
  • 个人兴趣项目汇总

    实时多人2d监测平台 deh传感器数据监控大屏 deh数字孪生 three js deh故障诊断软件系统 SAR故障诊断系统 自动化工厂展示大屏 Minest数据集数字检测平台 汇总在线展示链接
  • Java代码审计之命令执行漏洞

    进行代码审计时遇到一个比较典型命令执行漏洞 适合新手学习 给大家分享下整个过程 从代码中可以看出来程序只使用trim 方法对jdk进行了两遍的空格过滤 然后直接和后面拼接的命令一起执行 接着来找一下这个方法的调用链 可以看到这里依次调用了3
  • jquery怎么获取radio的值

    1 获取选中值 三种方法都可以 input radio checked val input type radio checked val input name rd checked val
  • java 实体类 临时注解_MyBatis-Plus 常用注解

    TableName TableId 主键专属 比如数据中的表中的字段是id 但是实体类是userId 那么就需要在userId上打上这个注解 用法 设置主键映射 value映射主键字段的名字 type 设置主键类型 主键的生成策略 圈起来的
  • git提交代码完整目录(详细)

    1 找到需要提交的git代码 2 初始化 git init 3 查询状态 git status 4 添加代码 git add test txt test txt是需要提交的文件 git add all 提交所有 5 git文件commit仓
  • DKVMN知识追踪描述

    由于在线学习课程的兴起 学习者在课程学习过程中有很多习题练习的记录 利用这些记录 知识追踪 Knowledge Tracing 希望通过对学习者过往练习的结果分析其当前对一些概念的掌握程度 知识追踪任务可以形式化为一个有监督的序列学习问题
  • eclipse + armgcc + pyocd(CMSIS-DAP) 进行嵌入式MCU Debug

    eclipse armgcc pyocd CMSIS DAP 进行嵌入式MCU Debug 由于中美贸易战的影响 备用方案将采用国产MCU 经过乱开发委员会的评估 认为华大 HDSC 的MCU性价比不错 但是keil官网找不到所选芯片的pd
  • Java thread中对异常的处理策略

    https www cnblogs com googlemeoften p 5769216 html
  • Flutter开发之滚动Widget

    移动端数据量比较大时 我们都是通过列表来进行展示的 比如商品数据 聊天列表 通信录 朋友圈等 在Android中 我们可以使用ListView或RecyclerView来实现 在iOS中 我们可以通过UITableView来实现 在Flut
  • sql中对日期的筛选

    转载自 点击打开链接 几个小时内的数据 DATE SUB NOW INTERVAL 5 HOUR 今天 select from 表名 where to days 时间字段名 to days now 昨天 SELECT FROM 表名 WHE
  • Flutter —— dart基础语法

    Flutter dart基础语法 1 Flutter 项目创建 2 Dart 语法 2 1 var final和const 2 2 num 2 3 string 2 4 list 和 map 2 5 和 2 6 方法 和 箭头函数 2 7
  • 刚面完的字节跳动Python软件测试用例编写(含思路)

    测试用例编写是软件测试的基本技能 也有很多人认为测试用例是软件测试的核心 软件测试中最重要的是设计和生成有效的测试用例 测试用例是测试工作的指导 是软件测试的必须遵守的准则 在这里我们不讨论以上的各种观点 但是综上所述 大家可以看出 测试用
  • QT中的connect用法总结

    第一种 首先来看看老版本的 connect 写法 比较复杂些 需要将信号和槽进行明确的指定 包括形参 看一个示例 为方便演示 先自定义一个 Button 然后定义两个重载的信号 lass MyButton public QWidget Q
  • 仓库 “https://download.docker.com/linux ubuntu Release” 没有 Release 文件。N: 无法安全地用该源进行更新,所以默认禁用该源

    解决 E 仓库 https download docker com linux ubuntu Release 没有 Release 文件 N 无法安全地用该源进行更新 所以默认禁用该源 在ubuntu16 04上安装Docker Engin
  • CentOS 7 修改系统运行级别(单用户/正常启动)

    常用的系统运行级别 3级 带网络多用户命令行界面 multi user target 5级 带网络多用户图像化界面 graphical target 正常启动的系统使用systemctl命令修改运行级别 查看当前运行级别 systemctl
  • [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索 Eastmount 关键字及截图的功能 而这篇文章主要简单介绍如何实现自动登录163邮箱 同时继续介绍Selenium Python官网Locating