Python零基础之selenium

1. selenium

1.1 什么是selenium

  • selenium 英[səˈliːniəm] 美[səˈliːniəm]
    n. 硒(化学元素,用于制造电气设备和有色玻璃,人体缺此元素可致抑郁等病);
  • Python中的selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

1.2 selenium的功能

  • 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  • 使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  • 使用简单,可使用Java,Python等多种语言编写用例脚本。

1.3 selenium的优势

  • Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台。
  • 通过编写模仿用户操作的 Selenium 测试脚本,可以从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。Selenium 的核心,也称browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。browser bot 负责执行从测试脚本接收到的命令,测试脚本要么是用 HTML 的表布局编写的,要么是使用一种受支持的编程语言编写的。

2. 初探selenium

2.1 selenium的一些方法

  • 下面的代码中列举了selenium的一些方法
  • 这些方法可以让我们快速的定位元素,从而实现模拟人与浏览器的交互
from selenium import webdriver
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()

# 打开目标url地址
driver.get('http://www.baidu.com')

# 1. 按照id查找
search_content = driver.find_element_by_id('kw').send_keys('python')
也可以通过.By类进行查找
s_box = driver.find_element(By.ID,'kw').send_keys('java')
s_button = driver.find_element_by_id('su').click()

# 2. 根据类名查找
s_box = driver.find_element_by_class_name('s_ipt').send_keys('unix')
s_box = driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('delphi')

# 3. 根据名称查找
s_box = driver.find_element_by_name('wd').send_keys('linux')
s_box = driver.find_element(By.NAME,'wd').send_keys('windows')

# 4. 根据标签名称查找
head = driver.find_element_by_tag_name('head')
head1 = driver.find_element(By.TAG_NAME,'head')

# 5. 根据xpath语法查找
# xpath路径可以通过chrome浏览器调试f12,选中标签右键copy xpath
s_box = driver.find_element_by_xpath('//*[@id="kw"]').send_keys('logo')
s_box = driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys('china')

# 6. 查找所有满足条件的元素: find_elements
inputTag = driver.find_elements_by_tag_name('input')
print(inputTag,len(inputTag))

2.2 selenium如何与浏览器互动

  • 下面是最常用的交互示例
  • 定位搜索框→输入字符→输入错误→清空字符→重新输入字符→点击按钮
from selenium import webdriver
import time


driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 1. 向输入框输入字符
# 只有活动标签才能用.send_keys,否则会报错
kw = driver.find_element_by_id('kw').send_keys('我还没被删除')


# 2. .clear()清空输入框中的内容
time.sleep(2)
clear = driver.find_element_by_id('kw').clear()

# 3. 操作checkbox标签
# 单击.click()
time.sleep(2)
kw = driver.find_element_by_id('kw').send_keys('python')
su = driver.find_element_by_id('su').click()

2.3 操作下拉菜单

  • 通过引入selenium.webdriver.support.ui类中的Select函数
  • from selenium.webdriver.support.ui import Select
  • 使用.select_by_value或.select_by_index进行下拉菜单select标签的选择
  • 注意:
    • 如果元素位于iframe下,则需要通过.switch_to_frame切换iframe
    • 否则无法找到对应的元素位置
    • 如果下拉菜单标签是非select标签,则采用find_element进行定位,并且在末尾要添加单击选择click()
from selenium import webdriver
# 引入Select方法
from selenium.webdriver.support.ui import Select


# 建立驱动
driver = webdriver.Chrome()

# 打开豆瓣 https://www.17sucai.com/pins/demo-show?id=5926
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')

# 发现无法找到位置
# selectTag = driver.find_element_by_class('nojs')
# 检查代码,发现iframe,存在页面嵌套,需要切换iframe
driver.switch_to_frame(driver.find_element_by_id('iframe'))

# 切换后再找标签位置
# 吧对象传参给Select()函数
selectTag = Select(driver.find_element_by_class_name('nojs'))


# 菜单的选择方式
# 1. 根据值选择
# 调用Select()函数的方法select_by_value
selectTag.select_by_value('JP')

# 2. 根据索引选择
# select_by_index
selectTag.select_by_index(2)

# 定位第二个下拉菜单进行选择
# 发现第二个下拉菜单标签是非select标签
# 非select标签可以正常去操作,不需要利用Select()函数
# 但是需要注意,后边一定要加.click()单机选择
selectTag = driver.find_element_by_id('dk_container_country-nofake').click()

key = int(input('请输入:'))
if key == 1:
    driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[1]').click()
elif key == 2:
    driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[2]').click()

2.4 行为链Action Chains

  • ActionChains是一种自动化低级交互的方法,例如鼠标移动、鼠标按钮操作、按键和上下文菜单交互。这对于执行更复杂的操作非常有用,比如悬停和拖放。
  • 生成用户操作。
    调用ActionChains对象上的操作方法时,这些操作将存储在ActionChains对象的队列中。当您调用Perform()时,事件会按照排队的顺序被触发。
  • 注意:
    • 需要引入ActionChains模块,才能使用行为链
    • from selenium.webdriver.common.action_chains import ActionChains
    • 需要actions.perform()提交行为链动作,否则行为链动作不执行
from selenium import webdriver
# 引入行为链
from selenium.webdriver.common.action_chains import ActionChains


# 建立驱动
driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

# 定位到输入框
inputTag = driver.find_element_by_id('kw')

# 定位到百度一下按钮
submitBtn = driver.find_element_by_id('su')

# 实例化对象
actions = ActionChains(driver)

# 把鼠标移动到输入框
actions.move_to_element(inputTag)

# 输入内容
actions.send_keys_to_element(inputTag,'美女')

# 点击搜索
actions.move_to_element(submitBtn).click()

# 提交行为链操作
# 如果不提交,则不会执行行为链动作
actions.perform()

3. 使用selenium自动登录豆瓣

3.1 代码示例

# !/usr/bin/python
# Filename: selenium登录豆瓣.py
# Data    : 2020/08/07
# Author  : --king--
# ctrl+alt+L自动加空格格式化


from selenium import webdriver
import time

# 建立驱动
driver = webdriver.Chrome()

# 打开豆瓣 https://www.douban.com
driver.get('https://www.douban.com/')

# 定位密码登录元素的位置
# login = driver.find_element_by_class_name('account-tab-account on')
# 发现找不到元素
# "account-tab-account on"中有一个空格,会导致无法定位
# 试试用xpath,去掉on看能否定位,依然不能,发现元素在iframe下,需要切换
login_iframe = driver.find_element_by_xpath('//div[@class="login"]/iframe')

# .switch_to_frame已经陈旧,以后使用.switch_to.frame进行切换
driver.switch_to.frame(login_iframe)

# 以上两行代码也可以直接写为
# driver.switch_to.frame(driver.find_element_by_xpath('//div[@class="login"]/iframe'))

# 点击密码登录选项
# 增加延时,速度过快会导致滑块反爬验证出现
time.sleep(2)
driver.find_element_by_xpath('//li[@class="account-tab-account"]').click()

# 点击下次自动登录
time.sleep(2)
driver.find_element_by_id('account-form-remember').click()

# 添加用户名
time.sleep(2)
driver.find_element_by_id('username').send_keys('xxxx321')

# 添加密码
time.sleep(2)
driver.find_element_by_id('password').send_keys('xxxx123')

# 点击登录豆瓣按钮
# 注意btn btn-account btn-active中有空格,无法正确定位,选择字符串中出现次数只有一次的btn-active进行定位
time.sleep(2)
driver.find_element_by_class_name('btn-active').click()

3.2 注意事项

  1. 注意元素是否在ifram中,如果在,则需要swith_to.frame(‘frame的xpath路径’)
  2. 注意增加延时等待,登录过快容易导致反爬,实测延时为1会导致滑块验证
  3. 查找对象如果有空格,最好填写不含空格的部分,尽量找唯一的内容进行查找,可以配合浏览器搜索来确定
  4. 3.1代码中的用户名密码是随意写的,测试请使用正确密码
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kingx3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值