首页 > 其他分享 >Selenium的操作

Selenium的操作

时间:2023-12-26 15:38:38浏览次数:37  
标签:webdriver 页面 Selenium element 操作 browser 节点 属性

简介

Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,并且支持大多数现代 Web 浏览器。

一、环境安装

2.安装selenimum包

pip install selenium

2.安装浏览器驱动

在官方下载EdgeDriver

Microsoft Edge WebDriver | Microsoft Edge Developer

Selenium的操作_Selenium

下载最新版的即可。

把下载的文件解压,并改名为:MicrosoftWebDriver.exe

并放在Anaconda的Scripts文件夹中

Selenium的操作_无头浏览器_02

二、基础用法

1.对页面进行操作

1.1 初始化浏览器对象

browser = webdriver.Edge()

1.2 访问页面

进行页面访问使用的是get方法,传入参数为待访问页面的URL地址即可。

browser = webdriver.Edge()
browser.get("http://www.baidu.com")
print(f'Cookies的值:{browser.get_cookies()}')
time.sleep(10)

这里sleep可以让程序停留一段时间

1.3 设置浏览器大小

set_window_size()方法可以用来设置浏览器大小(就是分辨率),而maximize_window则是设置浏览器为全屏。

import time
from selenium import webdriver
browser = webdriver.Edge()
browser.set_window_size(500, 500)
browser.get("http://www.baidu.com")
time.sleep(10)
import time
from selenium import webdriver
browser = webdriver.Edge()
browser.maximize_window()
browser.get("http://www.baidu.com")
time.sleep(10)

1.4 前进后退

前进后退也是我们在使用浏览器时非常常见的操作,这里forward()方法可以用来实现前进,back()可以用来实现后退。

import time
from selenium import webdriver

browser = webdriver.Edge()
browser.maximize_window()
browser.get("http://www.baidu.com")
time.sleep(2)
browser.get("https://www.bilibili.com/")
time.sleep(2)

# 后退到百度页面
browser.back()

time.sleep(10)

1.5 获取页面基础属性

当我们用selenium打开某个页面,有一些基础属性如网页标题、网址、浏览器名称、页面源码等信息

from selenium import webdriver
browser = webdriver.Edge()
browser.get('https://www.baidu.com')
# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)

2.定位页面元素

使用 selenium 定位页面元素的前提是你已经了解基本的页面布局及各种标签含义,当然如果之前没有接触过,现在我也可以带你简单的了解一下。

以我们熟知的 百度为例,我们进入首页,按 【F12】 进入开发者工具。红框中显示的就是页面的代码,我们要做的就是从代码中定位获取我们需要的元素。


我们在实际使用浏览器的时候,很重要的操作有输入文本、点击确定等等。对此,Selenium提供了一系列的方法来方便我们实现以上操作。通过webdriver对象的 find_element(by=“属性名”, value=“属性值”),主要包括以下这八种。

属性 函数

CLASS find_element(by=By.CLASS_NAME, value=‘’)

XPATH find_element(by=By.XPATH, value=‘’)

LINK_TEXT find_element(by=By.LINK_TEXT, value=‘’)

PARTIAL_LINK_TEXT find_element(by=By.PARTIAL_LINK_TEXT, value=‘’)

TAG find_element(by=By.TAG_NAME, value=‘’)

CSS find_element(by=By.CSS_SELECTOR, value=‘’)

ID find_element(by=By.ID, value=‘’)

还是以百度举例子

可以看到这个对应的class,name以及id分别是这些,通过以下语句都可以定位到这个元素。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Edge()
browser.get('https://www.baidu.com')
# 网页标题
inp = browser.find_element(by=By.CLASS_NAME, value="s_ipt")
inp.send_keys("大明王朝1566")
btn = browser.find_element(by=By.ID, value="su")
btn.click()

time.sleep(10)

3.模拟鼠标操作

既然是模拟浏览器操作,自然也就需要能模拟鼠标的一些操作了,这里需要导入ActionChains 类。

from selenium.webdriver.common.action_chains import ActionChains

3.1 常用操作

这个其实就是页面交互操作中的点击click()操作。

操作 函数

右击 context_click()

双击 double_click()

拖拽 double_and_drop()

悬停 move_to_element()

执行 perform()

4.模拟键盘操作

引入Keys类

from selenium.webdriver.common.keys import Keys

4.1 常用操作

操作 函数

删除键 send_keys(Keys.BACK_SPACE)

空格键 send_keys(Keys.SPACE)

制表键 send_keys(Keys.TAB)

回退键 send_keys(Keys.ESCAPE)

回车 send_keys(Keys.ENTER)

全选 send_keys(Keys.CONTRL,‘a’)

复制 send_keys(Keys.CONTRL,‘c’)

剪切 send_keys(Keys.CONTRL,‘x’)

粘贴 send_keys(Keys.CONTRL,‘x’)

键盘F1 send_keys(Keys.F1)

5. 延时等待

如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。

三种方式:强制等待、隐式等待和显式等待


5.1 强制等待

就很简单了,直接time.sleep(n)强制等待n秒,在执行get方法之后执行。


5.2 隐式等待

implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。


5.3 显式等待

设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。


WebDriverWait的参数说明:WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver: 浏览器驱动

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 每次检测的间隔时间,默认是0.5秒

ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常

until(method,message=‘’)

method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

message: 如果超时,抛出TimeoutException,将message传入异常

until_not(method,message=‘’): 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

from selenium.webdriver.support import expected_conditions as EC

# 判断标题是否和预期的一致

title_is

# 判断标题中是否包含预期的字符串

title_contains

# 判断指定元素是否加载出来

presence_of_element_located

# 判断所有元素是否加载完成

presence_of_all_elements_located

# 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0,传入参数是元组类型的locator

visibility_of_element_located

# 判断元素是否可见,传入参数是定位后的元素WebElement

visibility_of

# 判断某个元素是否不可见,或是否不存在于DOM树

invisibility_of_element_located

# 判断元素的 text 是否包含预期字符串

text_to_be_present_in_element

# 判断元素的 value 是否包含预期字符串

text_to_be_present_in_element_value

#判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement

frame_to_be_available_and_switch_to_it

#判断是否有alert出现

alert_is_present

#判断元素是否可点击

element_to_be_clickable

# 判断元素是否被选中,一般用在下拉列表,传入WebElement对象

element_to_be_selected

# 判断元素是否被选中

element_located_to_be_selected

# 判断元素的选中状态是否和预期一致,传入参数:定位后的元素,相等返回True,否则返回False

element_selection_state_to_be

# 判断元素的选中状态是否和预期一致,传入参数:元素的定位,相等返回True,否则返回False

element_located_selection_state_to_be

#判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了

staleness_of

6.切换操作

6.1 窗口切换

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

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

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

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

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


6.2 表单切换

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

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


7. 对Cookie操作

cookies 是识别用户登录与否的关键,爬虫中常常使用 selenium + requests 实现 cookie持久化,即先用 selenium 模拟登陆获取 cookie ,再通过 requests 携带 cookie 进行请求。

webdriver 提供 cookies 的几种操作:读取、添加删除。

get_cookies:以字典的形式返回当前会话中可见的 cookie 信息。

get_cookie(name):返回 cookie 字典中

key == name 的 cookie 信息

add_cookie(cookie_dict):将 cookie 添加到当前会话中

delete_cookie(name):删除指定名称的单个 cookie

delete_all_cookies():删除会话范围内的所有cookie


from selenium import webdriver
browser = webdriver.Chrome()
# 知乎发现页
browser.get('https://www.zhihu.com/explore')
# 获取cookie
print(f'Cookies的值:{browser.get_cookies()}')
# 添加cookie
browser.add_cookie({'name':'才哥', 'value':'帅哥'})
print(f'添加后Cookies的值:{browser.get_cookies()}')
# 删除cookie
browser.delete_all_cookies()
print(f'删除后Cookies的值:{browser.get_cookies()}')
# 总结


三、高级用法

1.execute_script方法

比如下拉进度条,模拟javaScript,使用execute_script方法来实现。


1.1 判断元素是否存在


from selenium.webdriver.common.by import By


def is_element_exist(browser, xpath):
    try:
        element = browser.find_element(by=By.XPATH, value=xpath)
        flag = True
    except:
        flag = False
    return flag


1.2 滑动滚轮到页面底端

from selenium import webdriver
import time

browser = webdriver.Edge()
browser.get('https://www.baidu.com')

temp_height=0
x=1000
y=1000
while True:
    js="var q=document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop={}".format(x)
    browser.excute_script(js)
    time.sleep(0.5)
    x+=y
    check_height=browser.excute_script("return document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop;")
    if check_height == temp_height:
        break
    temp_height=check_height

1.3 滑动滚轮至页面元素出现

将上面两者结合,就可以实现。

from selenium import webdriver
import time

browser = webdriver.Edge()
browser.get('https://www.baidu.com')

temp_height = 0
x = 1000
y = 1000
while True:
    js = "var q=document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop={}".format(x)
    browser.excute_script(js)
    time.sleep(0.5)
    x += y
    check_height = browser.excute_script(
        "return document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop;")
    if check_height == temp_height:
        break
    temp_height = check_height


1.4 滑动至动态元素可见

当我们需要定位的元素是动态元素,或者我们不确定它在哪时,可以先找到这个元素然后再使用JS操作

target = driver.find_element_by_id('id')

driver.execute_script("arguments[0].scrollIntoView();", target)

2.xpath方法

XPath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。

XPath路径表达式

表达式 描述

nodename 选取此节点的所有子节点(div)

/ 从根节点选取

// 选择任意位置的某个节点

. 选取当前节点

… 选取当前节点的父节点

@ 选取属性

XPath语法通配符


通配符 描述

* 匹配任何元素节点

@* 匹配任何属性节点

node() 匹配任何类型节点

2.1 文本定位

使用text()元素的text内容 如://button[text()=“登录”]


2.2 模糊定位

使用contains() 包含函数 如://button[contains(text(),“登录”)]、//button[contains(@class,“btn”)]

匹配以xx结尾的属性值 如://input[starts-with(@id,“login-”)]、//input[ends-with(@id,“ogin-email”)]


2.3 逻辑定位

使用逻辑运算符 – and、or;如://input[@name=“phone” and @datatype=“m”] 可以根据一个元素的多个属性进行定位,确保唯一性


2.4 轴定位

轴定位是根据父节点,兄弟节点等节点来定位本节点,使用语法: 轴名称 :: 节点名称,使用较多场景:页面显示为一个表格样式的数据列


描述 表达式

定位当前节点后的所有节点 //标签名[@属性=属性值]/follow::标签名[@属性=属性值]

定位同一节点后的所有同级节点 //标签名[@属性=属性值]/follow-sibling::标签名[@属性=属性值]

定位当前节点的所有子节点 //标签名[@属性=属性值]/child::标签名[@属性=属性值]

定位当前节点前的所有节点 //标签名[@属性=属性值]/preceding::标签名[@属性=属性值]

定位同一个节点前的所有同级节点 //标签名[@属性=属性值]/preceding-sibling::标签名[@属性=属性值]

定位当前节点的所有父节点 //标签名[@属性=属性值]/parent::标签名[@属性=属性值]

定位当前节点的所有祖父节点 //标签名[@属性=属性值]/ancestor::标签名[@属性=属性值]

xpath='//span[text()=''/ancestor::div[3]/check-box]'
element=browser.find_element(by=By.XPATH,value=xpath)

总结

selenium的基础用法已经介绍完了,让我们实际操作起来吧,有什么问题欢迎在评论区留言,希望大家能够点赞收藏!!!


标签:webdriver,页面,Selenium,element,操作,browser,节点,属性
From: https://blog.51cto.com/u_15590807/8983689

相关文章

  • JDBC快速入门:从环境搭建到代码编写,轻松实现数据库增删改查操作!
    通过上篇文章我们已经对JDBC的基本概念和工作原理都有了一定的了解,本篇文章我们继续来探索如何从零开始,一步步搭建开发环境,编写代码,最后实现数据库的增删改查操作。一、开发环境搭建首先,我们需要准备的开发环境有:Java开发工具包(JDK)、数据库(如MySQL)、数据库驱动(如MySQLConnector/......
  • C/C++中的宏相关操作
    C++中的宏具有一些高级用法,以下是其中的一些:可变参数宏:使用...;表示可变参数,在宏里对可变参数进行操作。比如使用 __VA_ARGS__ 来代表可变参数。字符串拼接:使用# 操作符,可以将参数转换为字符串。例如,#defineSTRINGIFY(x)#x 可以将 x 转换为字符串。标记连接:使用......
  • PHP 操作符spaceship
    PHP操作符spaceshipPHP7.0及以后的版本引入了spaceship操作符(<=>,也被称为三向比较运算符或组合比较运算符),这是一个非常有用的语法糖,用于比较两个表达式的大小。这个操作符返回一个整数值,表示两个表达式之间的关系,如下所示:如果$a小于$b,spaceship操作符返回-1。如果$a......
  • Linux 操作命令
    路是脚踏出来的,历史是人写出来的。人的每一步行动都在书写自己的历史。Linux基础命令open:打开文件操作,如环境配置文件。open~/.zshrcvi:vi(visualinterface),linux中最经典的文本编辑器vim(viimproved)是vi发展出来的一个文本编辑器,支持代码补全、编译、错误跳转......
  • JDBC快速入门:从环境搭建到代码编写,轻松实现数据库增删改查操作!
    通过上篇文章我们已经对JDBC的基本概念和工作原理都有了一定的了解,本篇文章我们继续来探索如何从零开始,一步步搭建开发环境,编写代码,最后实现数据库的增删改查操作。一、开发环境搭建首先,我们需要准备的开发环境有:Java开发工具包(JDK)、数据库(如MySQL)、数据库驱动(如MySQLConnector......
  • windows 操作文件
       Windows操作系统允许用户同时打开同一文本文件的多个实例,主要原因是记事本程序的设计与操作系统的文件访问机制。首先,我们先来看记事本程序的设计。当你在记事本中打开一个文件时,它会将文件的内容读入内存,并在内存中进行编辑。这意味着,实际上你在编辑的不是文件本身,而......
  • Linux CentOS7安装chrome和chromedriver,用于Selenium爬虫(java代码演示)
    ......
  • DOM操作之元素查找
    通常我们操作一个元素节点前都需要查找到这个元素,查找到这个元素有两种方式。使用选择器函数查找元素通过元素的关系属性来查找元素使用选择器函数查找getElementById通过节点元素的ID得到此节点<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • milvus的delete操作
    milvus的delete操作milvus版本:v2.3.2milvus支持delete操作。使用pythonsdk代码如下:frompymilvusimport(connections,Collection,)print("startconnectingtoMilvus")connections.connect("default",host="192.168.230.71",port=&qu......
  • python的列表的常用操作
    编号使用方式作用1列表.append(元素)向列表中追加一个元素2列表.extend(容器)将数据容器的内容依次取出,追加到列表尾部3列表.insert(下标,元素)在指定下标处,插入指定的元素4del列表,下标删除列表指定下标元素5列表.pop(下标)删除列表指定下标元素6......