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()
driver.get('http://www.baidu.com')
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()
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')
s_box = driver.find_element_by_name('wd').send_keys('linux')
s_box = driver.find_element(By.NAME,'wd').send_keys('windows')
head = driver.find_element_by_tag_name('head')
head1 = driver.find_element(By.TAG_NAME,'head')
s_box = driver.find_element_by_xpath('//*[@id="kw"]').send_keys('logo')
s_box = driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys('china')
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')
kw = driver.find_element_by_id('kw').send_keys('我还没被删除')
time.sleep(2)
clear = driver.find_element_by_id('kw').clear()
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
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')
driver.switch_to_frame(driver.find_element_by_id('iframe'))
selectTag = Select(driver.find_element_by_class_name('nojs'))
selectTag.select_by_value('JP')
selectTag.select_by_index(2)
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 代码示例
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.douban.com/')
login_iframe = driver.find_element_by_xpath('//div[@class="login"]/iframe')
driver.switch_to.frame(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')
time.sleep(2)
driver.find_element_by_class_name('btn-active').click()
3.2 注意事项
- 注意元素是否在ifram中,如果在,则需要swith_to.frame(‘frame的xpath路径’)
- 注意增加延时等待,登录过快容易导致反爬,实测延时为1会导致滑块验证
- 查找对象如果有空格,最好填写不含空格的部分,尽量找唯一的内容进行查找,可以配合浏览器搜索来确定
- 3.1代码中的用户名密码是随意写的,测试请使用正确密码