Selenium Python 教程第3章: 页面的相关操作

news2024/12/27 11:35:47

在这里插入图片描述

3、针对Web页面的相关操作

最基本的页面操作也许是使用WebDriver打开一个链接。 常规的方法是调用 get 方法:

driver.get("http://www.python.org")

WebDriver 将等待,直到页面完全加载完毕(其实是等到 onload 方法执行完毕),然后返回继续执行你的脚本。 值得注意的是,如果你的页面使用了大量的Ajax加载, WebDriver可能不知道什么时候页面已经完全加载。 如果你想确保页面完全加载完毕,可以使用 waits功能

3.1. 与页面交互

仅仅打开1个页面并没有实际意义,我们真正想要的是与页面做交互。 更具体地说,对于一个页面中的HTML元素,常见操作包括:

3.1.1 定位网页元素

WebDriver 提供了大量的方法帮助你去查找元素,例如:已知一个元素定义如下:

<input type="text" name="passwd" id="passwd-id" />

你可以通过下面的方法查找该元素:

element = driver.find_element_by_id(“passwd-id”)
element = driver.find_element_by_name(“passwd”)
element = driver.find_element_by_xpath(“//input[@id=‘passwd-id’]”)
你还可以通过链接的文本查找他,需要注意的是,这个文本必须完全匹地配。 当你使用XPATH时,你必须注意,如果匹配超过一个元素,只返回第一个元素。 如果上面也没找到,将会抛出 NoSuchElementException异常。

3.2.2. 获取元素内容

获取元素文本:

element = driver.find_elements_by_class_name("flower")
#方式1
print(element.text)
#方式2
print(element.get_attribute(‘textContent’))

获取元素对应的HTML文本内容

print(element.get_attribute("outerHTML"))

output

<div class='flower'><span>Rose</span></div>

获取input输入框的值

element.get_attribute(‘value’)

3.2.2 向文本框元素输入内容

当你拿到ige元素时,你能做什么呢?首先,你可能会想在文本框中输入一些内容:

element.send_keys("some text")

3)模拟键盘、鼠标操作
你还可以通过”Keys”类来模式输入方向键:

element.send_keys(" and some", Keys.ARROW_DOWN)

对于任何元素,他可能都叫 send_keys ,这就使得它可以测试键盘快捷键,可使用 clear 方法去清除input或者textarea元素中的内容:

element.clear()

3.2. 填写表单

我们已经知道如何在input或textarea元素中输入内容,但是其他元素怎么办? 你可以“切换”下拉框的状态,你可以使用setSelected方法去做一些事情,比如 选择下拉列表,处理SELECT元素其实没有那么麻烦:

element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))
    option.click()

上面这段代码将会寻找页面第一个 “SELECT” 元素, 并且循环他的每一个OPTION元素, 打印从utamen的值,然后按顺序都选中一遍。

正如你说看到的那样,这不是处理 SELECT 元素最好的方法。WebDriver的支持类包括一个叫做 Select的类,他提供有用的方法处理这些内容:

from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)
WebDriver 也提供一些有用的方法来取消选择已经选择的元素:

select = Select(driver.find_element_by_id('id'))
select.deselect_all()

这将取消选择所以的OPTION。

假设在一个案例中,我们需要列出所有已经选择的选项,Select类提供了方便的方法来实现这一点:

select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options

获得所以选项:

options = select.options

一旦你填写完整个表单,你应该想去提交它,有一个方法就是去找到一个“submit” 按钮然后点击它:

# Assume the button has the ID "submit" :)
driver.find_element_by_id("submit").click()

或者,WebDriver对每一个元素都有一个叫做 “submit” 的方法,如果你在一个表单内的 元素上使用该方法,WebDriver会在DOM树上就近找到最近的表单,返回提交它。 如果调用的元素不再表单内,将会抛出NoSuchElementException异常:

element.submit()

3.3. 拖放

您可以使用拖放,无论是移动一个元素,或放到另一个元素内:

element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")

from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

3.4. 在不同的窗口和框架之间移动

对于现在的web应用来说,没有任何frames或者只包含一个window窗口是比较罕见的。 WebDriver 支持在不同的窗口之间移动,只需要调用switch_to_window方法即可:

driver.switch_to_window("windowName")

所有的 driver 将会指向当前窗口,但是你怎么知道当前窗口的名字呢,查看打开他的javascript或者连接代码:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

或者,你可以在”switch_to_window()”中使用”窗口句柄”来打开它, 知道了这些,你就可以迭代所有已经打开的窗口了:

for handle in driver.window_handles:
    driver.switch_to_window(handle)

你还可以在不同的frame中切换 (or into iframes):

driver.switch_to_frame("frameName")

通过“.”操作符你还可以获得子frame,并通过下标指定任意frame,就像这样:

driver.switch_to_frame("frameName.0.child")

如何获取名叫“frameName”的frame中名叫 “child”的子frame呢? 来自topframe的所有的frame都会被评估 (All frames are evaluated as if from top.)

一旦我们完成了frame中的工作,我们可以这样返回父frame:

driver.switch_to_default_content()

3.5. 弹出对话框

Selenium WebDriver 内置了对处理弹出对话框的支持。 在你的某些动作之后可能会触发弹出对话框,你可以像下面这样访问对话框:

alert = driver.switch_to_alert()

它将返回当前打开的对话框对象。使用此对象,您现在可以接受、排除、读取其内容, 甚至可以在prompt对话框中输入(译注:prompt()是对话框的一种,不同于alert()对话框,不同点可以自行百度)。 这个接口对alert, confirm, prompt 对话框效果相同。 参考相关的API文档获取更多信息。

3.6. 访问浏览器历史记录

在之前的文章中,我们使用get命令打开一个页面, ( driver.get(“http://www.example.com”)),WebDriver有很多更小的,以任务为导向的接口, navigation就是一个有用的任务,打开一个页面你可以使用get:

driver.get("http://www.example.com")

在浏览历史中前进和后退你可以使用:

driver.forward()
driver.back()

请注意,这个功能完全取决于底层驱动程序。当你调用这些方法的时候,很有可能会发生意想不到的事情, 如果你习惯了浏览器的这些行为于其他的不同。

3.7. 操作Cookies

在我们结束这一节之前,或许你对如何操作Cookies可能会很感兴趣。 首先,你需要打开一个也面,因为Cookie是在某个域名下才生效的:

::
# 打开一个页面 driver.get(“http://www.example.com”)

# 现在设置Cookies,这个cookie在域名根目录下(”/”)生效 cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’} driver.add_cookie(cookie)

# 现在获取所有当前URL下可获得的Cookies driver.get_cookies()

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

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

相关文章

VS报错 --- error LNK2019: 无法解析的外部符号

运行vs程序时候&#xff0c;一般会出现这个错误 &#xff1a; 1 error LNK2019: 无法解析的外部符号 _lws_create_context4&#xff0c;该符号在函数 "public: bool __thiscall WebsocketServerApp::startServer(char const *,int)" (?startServerWebsocketServe…

只是做笔记有必要入手苹果笔吗?好用又便宜的平替苹果笔

苹果原装电容笔和那种只具备倾斜压感的平替电容笔不一样&#xff0c;平替电容笔并没有具备重力压感。但是&#xff0c;如果你并不经常需要绘画的话&#xff0c;那么你也不必花费太多的金钱来购买一支价格如此贵的苹果电容笔&#xff0c;选择一款平替电容笔即可。在这里&#xf…

【期末复习】云计算要点

【选择】 【判断】 【解答】打*为录音明确提出的内容 1*.大数据现象是怎么形成的&#xff1f; 大数据就是&#xff1a;海量数据或巨量数据&#xff0c;其规模巨大到无法通过目前主流的计算机系统在合理时间内获取、存储、管理、处理并提炼以帮助使用者决策。大数据产生的原因…

SSH服务器

文章目录 文字接口连接服务器&#xff1a;SSH服务器连接加密技术简介启动SSH服务SSH客户端连接程序SSH&#xff1a;直接登录远程主机的指令使用案例 服务器公钥记录文件&#xff1a;~/.ssh/known_hosts报错解决 模拟FTP的文件传输方式&#xff1a;SFTP使用案例 文件异地直接复制…

用python写网络爬虫

第二章 数据抓取 首先 &#xff0c; 我们会介绍一个叫 做Firebug Lite 的浏览器扩展&#xff0c; 用 于检查网页 内容 &#xff0c; 如 果你有一些网络开发背景的话&#xff0c; 可能 己经对该扩展十分熟悉 了 。 然后 &#xff0c;我们会介绍三 种抽取网 页数据的 方法 &…

【算法刷题】其他技巧

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于网上知识点进行的&#xff0c;每个代码参考热门博客和GPT3.5&#…

vivo 帐号服务稳定性建设之路-平台产品系列06

作者&#xff1a;vivo 互联网平台产品研发团队- Shi Jianhua、Sun Song 帐号是一个核心的基础服务&#xff0c;对于基础服务而言稳定性就是生命线。在这篇文章中&#xff0c;将与大家分享我们在帐号稳定性建设方面的经验和探索。 一、前言 vivo帐号是用户畅享整个vivo生态服务…

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Python】数据容器总结 ② ( 数据容器元素排序 | 字符串大小比较 | 字符大小比较 | 长短一样的字符串大小比较 | 长短不一样的字符串大小比较 )

文章目录 一、数据容器元素排序二、字符串大小比较1、字符大小比较2、长短一样的字符串大小比较3、长短不一样的字符串大小比较 一、数据容器元素排序 调用 sorted 函数 , 可以对 数据容器 中的元素进行排序 ; sorted(数据容器变量, [reverseTrue])上述两个参数 , 第一个 数据…

开源!一款.Net开发的全能工具EverythingToolbar,节约你90%操作时间!

今天给大家推荐一款已获得6.3K stars的.Net开发的开源全能工具EverythingToolbar。EverythingToolbar 是由 Everything 提供支持的 Windows 任务栏的即时文件搜索集成&#xff0c;可以替换操作系统任务栏上的 Windows 搜索&#xff0c;使 Windows 上的文件搜索更快、更可靠。 …

Hive 库表相关操作

1、Hive内部表和外部表 1.内部表&#xff1a;未被external修饰&#xff1b;外部表&#xff1a;被external修饰。 区别&#xff1a; &#xff08;1&#xff09;内部表数据由Hive自身管理&#xff0c;外部表数据由HDFS管理&#xff1b; &#xff08;2&#xff09;内部表数据存…

ESP32(Micro Python) LVGL 传感器数值显示

本程序用于显示SR04超声波传感器和BMP280气压温度传感器的读数。由于高度数值类型不符合要求&#xff0c;BMP280改为显示气压和温度值。气压值分两部分显示&#xff0c;分别为千帕值-100&#xff08;避免超出表盘显示范围&#xff09;和千帕值的两位小数。由于标签不能显示动态…

在Mybatis执行插入数据时,如何将Date类型字段设置为“yyyy-MM-dd”的格式

1、问题描述 使用mybatis新增插入一条数据到MySQL数据库时&#xff0c; 其中实体类对象的一个属性”hiredate“的类型是日期类型Date&#xff0c; 此属性在数据库中对应的字段“hiredate”类型也是日期Date类型&#xff0c; 但是在数据库中要求“hiredate”字段的字段值为“yy…

瑞萨RA4M2 基于CAN总线的UDS诊断升级MCU工具 /bootloader/UDS诊断/14229/15765

基于can总线的UDS软件升级 最近学习UDS诊断协议&#xff08;ISO14229&#xff09;&#xff0c;是一项国际标准&#xff0c;为汽车电子系统中的诊断通信定义了统一的协议和服务。它规定了与诊断相关的服务需求&#xff0c;并没有设计通信机制。ISO14229仅对应用层和会话层做出了…

【SpringCloud入门】-- 认识微服务

目录 1. 什么是微服务&#xff1f; 2. 微服务的优势&#xff1f; 3. 单体架构&#xff0c;分布式架构&#xff0c;微服务架构的区别以及优缺点&#xff1f; 4. SpringCloud和Spring Cloud Alibaba是什么&#xff1f; 5. SpringCloud和SpringCloudAlibaba的区别&#xff1f…

apple pencil二代值不值得买?口碑好的电容笔排行榜

事实上&#xff0c;苹果Pencil与市场上普通的电容笔最大的区别就是在重量和压感上。苹果pencil拥有着独特的重力压感&#xff0c;可以很好运用于绘画上&#xff0c;但是&#xff0c;随着苹果Pencil的价格一直高居不下&#xff0c;而平替电容笔各种性能的不断提高&#xff0c;苹…

Vue中如何进行3D场景展示与交互(如Three.js)

Vue中如何进行3D场景展示与交互&#xff08;如Three.js&#xff09; 随着WebGL技术的发展&#xff0c;越来越多的网站开始使用3D场景来展示产品、游戏等内容。在Vue中&#xff0c;我们可以使用第三方库Three.js来实现3D场景的展示与交互。本文将介绍如何在Vue中使用Three.js来…

和 if else说再见,SpringBoot 这样做参数校验才足够优雅!

1. 概述 当我们想提供可靠的 API 接口&#xff0c;对参数的校验&#xff0c;以保证最终数据入库的正确性&#xff0c;是 必不可少 的活。比如下图就是 我们一个项目里 新增一个菜单校验 参数的函数&#xff0c;写了一大堆的 if else 进行校验&#xff0c;非常的不优雅&#xf…

语音验证码短信原理和应用场景分析

引言 随着移动互联网的快速发展&#xff0c;短信验证码成为了许多应用和服务中常用的身份验证方式。然而&#xff0c;有时候用户可能由于各种原因无法接收到短信验证码&#xff0c;或者对于文字验证码不够方便或友好。 为了解决这些问题&#xff0c;语音验证码短信API 应运而…

【论文精读ACL_2021】Prefix-Tuning: Optimizing Continuous Prompts for Generation

【论文精读ACL_2021】Prefix-Tuning: Optimizing Continuous Prompts for Generation 0、前言Abstract1 Introduction2 Related Work2.1 Fine-tuning for natural language generation.2.2 Lightweight fine-tuning2.3 Prompting.2.4 Controllable generation. 3 Problem State…