首页 > 其他分享 >selenium

selenium

时间:2024-12-12 11:00:35浏览次数:1  
标签:keys 元素 selenium send element find browser

selenium

1. 基础页面操作

browser/web = webdriver.Chrome()
web.refresh()
web.forward()
web.back()
web.switch_to.window(web.window_handles[-1])

2. 页面属性

print(browser.page_source)

3. 页面元素定位

3.1 id定位

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
browser.find_element_by_id('kw').send_keys('python')

3.2 name定位

browser.find_element_by_name('wd').send_keys('python')

3.3 class定位

browser.find_element_by_class_name('s_ipt').send_keys('python')

3.4 tag定位

browser.find_element_by_tag_name('input').send_keys('python')

往往有很多同类tag,所以其实很难通过tag去区分不同的元素

3.5. link定位

# 定位文本链接
browser.find_element_by_link_text('新闻').click()

3.6. partial定位

# 只截取一部分字符串,用这种方法模糊匹配
browser.find_element_by_partial_link_text('闻').click()

3.7. xpath定位

# 上述定位可能不唯一
browser.find_element_by_xpath("//*[@id='kw']").send_keys('python')

3.8. css定位

# 这种方法相对xpath要简洁些,定位速度也要快些
browser.find_element_by_css_selector('#kw').send_keys('python')

3.9. find_element的By定位

除了上述的8种定位方法,Selenium还提供了一个通用的方法find_element(),这个方法有两个参数:定位方式和定位值。

# 使用前先导入By类
from selenium.webdriver.common.by import By

以上的操作可以等同于以下:

browser.find_element(By.ID,'kw')
browser.find_element(By.NAME,'wd')
browser.find_element(By.CLASS_NAME,'s_ipt')
browser.find_element(By.TAG_NAME,'input')
browser.find_element(By.LINK_TEXT,'新闻')
browser.find_element(By.PARTIAL_LINK_TEXT,'闻')
browser.find_element(By.XPATH,'//*[@id="kw"]')
browser.find_element(By.CSS_SELECTOR,'#kw')

3.10 多个元素

如果定位的目标元素在网页中不止一个,那么则需要用到find_elements,得到的结果会是列表形式。简单来说,就是element后面多了复数标识s,其他操作一致。

4. 获取页面元素属性

4.1. get_attribute获取属性

<img hidefocus="true" id="s_lg_img" class="index-logo-src" src="//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" width="270" height="129" one rror="this.src='//www.baidu.com/img/flexible/logo/pc/index.png';this.onerror=null;" usemap="#mp">
logo = browser.find_element_by_class_name('index-logo-src')
print(logo)
print(logo.get_attribute('src'))

4.2. 获取文本

<a class="title-content tag-width c-link c-font-medium c-line-clamp1" href="https://www.baidu.com/s?cl=3&amp;tn=baidutop10&amp;fr=top1000&amp;wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&amp;rsv_idx=2&amp;rsv_dl=fyb_n_homepage&amp;sa=fyb_n_homepage&amp;hisfilter=1" target="_blank"><span class="title-content-index c-index-single c-index-single-hot1">1</span><span class="title-content-title">各地贯彻十九届六中全会精神纪实</span></a>
logo = browser.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(1) > a')
print(logo.text)
print(logo.get_attribute('href'))

4.3. 获取其他属性

除了属性和文本值外,还有id、位置、标签名和大小等属性。

logo = browser.find_element_by_class_name('index-logo-src')
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)

输出:

6af39c9b-70e8-4033-8a74-7201ae09d540
{'x': 490, 'y': 46}
img
{'height': 129, 'width': 270}

5. 页面交互操作

页面交互就是在浏览器的各种操作,比如上面演示过的输入文本、点击链接等等,还有像清除文本、回车确认、单选框与多选框选中等。

5.1. 输入文本

# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 输入python
input.send_keys('python')

5.2. 点击

# 选中新闻按钮
click = browser.find_element_by_link_text('新闻')
# 点击之
click.click()

5.3. 清除文本

# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 输入python
input.send_keys('python')
time.sleep(2)
# 清除python
input.clear()
time.sleep(2)

5.4 回车

比如,在搜索框输入文本python,然后回车就出查询操作结果的情况

# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 输入python
input.send_keys('python')
time.sleep(2)
# 回车查询
input.submit()
time.sleep(5)

5.5. 单选

单选比较好操作,先定位需要单选的某个元素,然后点击一下即可。

5.6. 多选

多选好像也比较容易,依次定位需要选择的元素,点击即可。

5.7. 下拉框

下拉框的操作相对复杂一些,需要用到Select模块。

先导入该类

from selenium.webdriver.support.select import Select

select模块中有以下定位方法

'''1、三种选择某一选项项的方法'''
 
select_by_index()           # 通过索引定位;注意:index索引是从“0”开始。
select_by_value()           # 通过value值定位,value标签的属性值。
select_by_visible_text()    # 通过文本值定位,即显示在下拉框的值。
 
'''2、三种返回options信息的方法'''
 
options                     # 返回select元素所有的options
all_selected_options        # 返回select元素中所有已选中的选项
first_selected_options      # 返回select元素中选中的第一个选项                  
 
 
'''3、四种取消选中项的方法'''
 
deselect_all                # 取消全部的已选择项
deselect_by_index           # 取消已选中的索引项
deselect_by_value           # 取消已选中的value值
deselect_by_visible_text    # 取消已选中的文本值

6. 多窗口切换

比如同一个页面的不同子页面的节点元素获取操作,不同选项卡之间的切换以及不同浏览器窗口之间的切换操作等等。

6.1. Frame切换

Selenium打开一个页面之后,默认是在父页面进行操作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则需要切换到子页面进行擦走,这时候switch_to.frame()就来了。如果想回到父页面,用switch_to.parent_frame()即可。

6.2. 选项卡切换

我们在访问网页的时候会打开很多个页面,在Selenium中提供了一些方法方便我们对这些页面进行操作。

current_window_handle:获取当前窗口的句柄。
window_handles:返回当前浏览器的所有窗口的句柄。
switch_to_window():用于切换到对应的窗口。
# 打开百度
browser.get('http://www.baidu.com')
# 新建一个选项卡
browser.execute_script('window.open()')
print(browser.window_handles)
# 跳转到第二个选项卡并打开知乎
browser.switch_to.window(browser.window_handles[1])
browser.get('http://www.zhihu.com')
# 回到第一个选项卡并打开淘宝(原来的百度页面改为了淘宝)
time.sleep(2)
browser.switch_to.window(browser.window_handles[0])
browser.get('http://www.taobao.com')

7. 模拟鼠标操作

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

from selenium.webdriver.common.action_chains import ActionChains

7.1. 左键

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

7.2. 右键

context_click()
# 定位到要右击的元素,这里选的新闻链接
right_click = browser.find_element_by_link_text('新闻')
# 执行鼠标右键操作
ActionChains(browser).context_click(right_click).perform()
time.sleep(2)

7.3. 双击

double_click()
# 定位到要双击的元素
double_click = browser.find_element_by_css_selector('#bottom_layer > div > p:nth-child(8) > span')
# 双击
ActionChains(browser).double_click(double_click).perform()
time.sleep(15)

7.4. 拖拽

drag_and_drop(source,target)拖拽操作,开始位置和结束位置需要被指定,这个常用于滑块类验证码的操作之类。

7.5. 悬停

move_to_element()
# 定位悬停的位置
move = browser.find_element_by_css_selector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap > span.soutu-btn")
# 悬停操作
ActionChains(browser).move_to_element(move).perform()
time.sleep(5)

8. 模拟键盘操作

selenium中的Keys()类提供了大部分的键盘操作方法,通过send_keys()方法来模拟键盘上的按键。

引入Keys

from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE):删除键(BackSpace)
send_keys(Keys.SPACE):空格键(Space)
send_keys(Keys.TAB):制表键(TAB)
send_keys(Keys.ESCAPE):回退键(ESCAPE)
send_keys(Keys.ENTER):回车键(ENTER)
send_keys(Keys.CONTRL,'a'):全选(Ctrl+A)
send_keys(Keys.CONTRL,'c'):复制(Ctrl+C)
send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)
send_keys(Keys.CONTRL,'v'):粘贴(Ctrl+V)
send_keys(Keys.F1):键盘F1
.....
send_keys(Keys.F12):键盘F12
# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 输入python
input.send_keys('python')
time.sleep(2)
# 回车
input.send_keys(Keys.ENTER)
time.sleep(5)

9. 延时等待

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

三种方式可以来玩玩:强制等待、隐式等待和显式等待

9.1. 强制等待

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

9.2. 隐式等待

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

# 隐式等待,等待时间10秒
browser.implicitly_wait(10)  

9.3. 显式等待

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

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 设置等待时间10s
wait = WebDriverWait(browser, 10)
# 设置判断条件:等待id='kw'的元素加载完成
input = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
# 在关键词输入:关键词
input.send_keys('Python')
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_not 与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

10. 其他

补充一些

10.1. 运行JavaScript

还有一些操作,比如下拉进度条,模拟javaScript,使用execute_script方法来实现。

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

selenium使用过程中,还可以很方便对Cookie进行获取、添加与删除等操作。

# 获取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()}')

输出:

Cookies的值:[{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com', ...]

添加后Cookies的值:[{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '才哥', 'path': '/', 'secure': True, 'value': '帅哥'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com',...]

删除后Cookies的值:[]

标签:keys,元素,selenium,send,element,find,browser
From: https://www.cnblogs.com/rzyin/p/18601961

相关文章

  • CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
    SeleniumSelenium是一款开源且可移植的自动化软件测试工具,专门用于测试网页端应用程序或者采集网页端数据。它能够在不同的浏览器和操作系统上运行,具有很强的跨平台能力。Selenium可以帮助测试人员更高效地自动化测试基于Web网页端的应用程序,也可以帮忙开发者方便地完成网页端数......
  • Python使用Selenium库获取 网页节点元素、名称、内容的方法
    我们要用到一些网页源码信息,例如获取一些节点的class内容,除了使用Beautifulsoup来解析,还可以直接用Selenium库打印节点(元素)名称,用来获取元素的文本内容或者标签名。例如获取下面的class的内容:以下是几种常用的方法:1.获取元素的属性值:使用元素的.get_attribute('attri......
  • Selenium IDE:Web自动化测试的得力助手
    SeleniumIDE:Web自动化测试的得力助手在快速迭代的软件开发环境中,自动化测试已成为确保软件质量的重要一环。SeleniumIDE作为一款开源的Web自动化测试工具,以其简单易用、功能强大的特点,成为了许多测试人员的首选。本文将详细介绍SeleniumIDE的基本概念、安装方法、使用方......
  • 04selenium爬虫轻松入门
    selenium爬虫简介:能够模拟浏览器运行是自动化测试工具pipinstallselenium安装selenium针对不同的浏览器需要安装不同的驱动确认浏览器的版本https://www.cnblogs.com/aiyablog/articles/17948703下载驱动#@作者:Alice#@时间:2024/12/722:10fromseleniumimpo......
  • Python Selenium 各浏览器驱动下载与配置使用(详细流程)
    1、安装pipinstallselenium2、浏览器驱动下载Chrome(google)浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html 或 https://sites.google.com/a/chromium.org/chromedriver/home. 下载地址:http://chromedriver.storage.googleapis.com/inde......
  • SpringBoot中Selenium详解
    文章目录SpringBoot中Selenium详解一、引言二、集成Selenium1、环境准备1.1、添加依赖2、编写测试代码2.1、测试主类2.2、页面对象2.3、搜索组件三、使用示例四、总结SpringBoot中Selenium详解一、引言在现代软件开发中,自动化测试是提高软件质量、减少重复工作......
  • 爬虫—CrawlSpider 结合 Selenium实现抓取目录页url 并通过 url 进一步抓取每章内容
    1.环境准备首先,确保安装了所需的依赖:pipinstallscrapyscrapy-seleniumselenium然后,你需要下载与Chrome浏览器匹配的ChromeDriver,并将其路径添加到系统的环境变量中。或者,你可以在代码中指定Selenium驱动程序的路径。2.配置ScrapySettings在settings.py......
  • Linux无图形界面环境使用Python+Selenium实践 (转载)
    原文链接:https://developer.aliyun.com/article/1511623简介: 在Linux上使用Selenium和Python来控制浏览器进行自动化测试或者网页数据抓取是常见的需求。本文将介绍如何在Linux无图形界面环境下使用Selenium与Firefox浏览器以headless模式运行,并提供geckodriver、Xvfb和pyvirtu......
  • [AirTest] airtest-selenium做Web自动化测试(上手实操三)&& airtest 代码改写成用 Djang
            经过了实操二的 测试用例复用(循环) 的实现,现对其进行改造提升优化。        实操一让我们知道了如何做单个测试用例的 自动化测试,实操二让我们知道了如何做多个测试用例的 自动化测试,那么,如何把实操二写的脚本变成更方便的测试脚本,让多个测试用例......
  • [AirTest] airtest-selenium做Web自动化测试(上手实操二)&& 如何让其实现测试用例复用(循
        经过了实操一的 初步Web自动化测试 的实现,现对其进行改造提升优化。        实操一让我们知道了如何做单个测试用例的自动化测试,那么如何实现多个测试用例的自动化测试呢?实操一快速通道:  [AirTest]airtest-selenium做Web自动化测试(上手实操一)&&如......