Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器,也包括PhantomJS这些无界面的浏览器。
Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用,所以需要浏览器驱动,以便selenium操作浏览器。
安装webdriver:
各大浏览器的webdriver地址如下:
Firefox:https://github.com/mozilla/geckodriver/releases/
Chrome:http://chromedriver.storage.googleapis.com/index.html
IE:http://selenium-release.storage.googleapis.com/index.html
注意:webdriver需要和对应的浏览器版本以及selenium版本对应
下载webdriver后拷贝至:
Win:复制webdriver到Python安装目录下
Mac:复制webdriver到/usr/local/bin目录下
也可以放在别出,实例对象时使用executable_path=‘’指定位置
好了,准备工作差不多了,开始怼,遇到问题再解决。
代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://music.163.com')
# browser.set_window_size(1024,768) # 设置窗口尺寸
browser.maximize_window() # 全屏
# 设置全局的隐式等待(直到找到元素),10秒后找不到抛出找不到元素
browser.implicitly_wait(10)
# 显式等待找到元素id=g_nav2, 0.5秒巡查一次,5秒超时
echoobj = WebDriverWait(browser,5,0.5).until(EC.visibility_of_element_located((By.ID,'g_nav2')))
time.sleep(1)
# 截取当前屏幕
browser.get_screenshot_as_file('./v.png')
# 仅截echoobj对象的范围,定点元素截图
echoobj.screenshot('./p.png')
print('元素大小:',echoobj.size) # g_nav2元素大小
print('元素是否显示:',echoobj.is_displayed()) # True 显示,False 隐藏
print(browser.title)
print(browser.current_url) # 当前URL
print('窗口句柄:',browser.current_window_handle)
# 点击按钮
browser.find_element_by_css_selector('.link.s-fc3').click()
# time.sleep(1)
browser.find_element_by_css_selector('.u-btn2.other').click()
# time.sleep(1)
browser.find_element_by_id('j-official-terms').click()
# time.sleep(1)
browser.find_element_by_css_selector('.u-btn2.u-btn2-2').click()
# time.sleep(1)
# 登录手机号账户
browser.find_element_by_id('p').send_keys('user name')
browser.find_element_by_id('pw').send_keys('password')
browser.find_element_by_css_selector('.j-primary.u-btn2.u-btn2-2').click()
browser.refresh() # 刷新页面
# 点击排行榜
browser.find_element_by_css_selector('#g_nav2 > div > ul > li:nth-child(2) > a').click()
# 切到id=g_iframe的iframe,以便播放歌曲
browser.switch_to.frame('g_iframe')
time.sleep(1)
browser.find_element_by_css_selector(".u-btn2.u-btn2-2.u-btni-addply.f-fl").click() # 播放
time.sleep(10)
# 切换到上一层,跳出当前iframe,因为当前只有一个主 html和一个嵌套iframe,挑出后回到主html
browser.switch_to.parent_frame()
# browser.switch_to.default_content() # 切到主HTML
# 搜索歌曲,播放
bs = browser.find_element_by_id('srch')
bs.send_keys('海底')
# 键盘回车操作
bs.send_keys(Keys.ENTER)
browser.switch_to.frame('g_iframe')
# browser.find_element_by_id('song_1426649237').click() # 功能同下
browser.find_element_by_class_name('ply').click()
time.sleep(10)
browser.quit()
打开网易云音乐,手机号登录,播放排行榜歌曲,再搜索歌曲播放,最后关闭网页,大概就这些操作流程,需要注释的在代码内都有。
下面是常用的元素定位及操作:
元素定位:
#通过id方式定位
browser.find_element_by_id("kw")
#通过name方式定位
browser.find_element_by_name("wd")
#通过tag name方式定位
browser.find_element_by_tag_name("input")
#通过class name方式定位
browser.find_element_by_class_name("s_ipt")
#多个class name定位
browser.find_element_by_css_selector(".class1.class2")
#通过CSS方式定位
browser.find_element_by_css_selector("#kw")
#通过xpath方式定位
browser.find_element_by_xpath("//input[@id='kw']")
操作对象:
click():点击对象
send_keys(“input”):在对象上模拟按键输入
clear():清除对象的内容
submit():提交对象的内容
text:用于获取元素的文本信息
get_attribute("href"):获取标签的某值
键盘操作:
from selenium.webdriver.common.keys import Keys
send_keys(Keys.TAB):tab
send_keys(Keys.ENTER) :回车
send_keys(Keys.CONTROL,'a') :全选,ctrl+a
可以使用dir(Keys)查看支持哪些键盘操作,help(Kesys)查看使用方法。
鼠标操作:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains 常用方法:
perform():执行所有ActionChains 中存储的行为;
context_click():右击;
double_click() :双击;
drag_and_drop() :拖动;
move_to_element() :鼠标悬停。
同上也可以使用dir(),help()方法。
截图方法:
bobj.screenshot(' '):仅截bobj对象的范围,定点元素截图
get_screenshot_as_file(' '):截图屏幕
get_screenshot_as_base64(‘ ’):截图屏幕,base64格式
get_screenshot_as_png(‘ ‘ ):截图屏幕,二进制格式
浏览器的前进后退:
forward():前进
back():后退
注意:如果出现找不到定位元素的错误,首先先检查该元素是否在iframe块内,如果在需要切入iframe内定位元素(switch_to.frame('iframe_id')),示例代码有使用。
示例代码运行时会打开浏览器,但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。这里不做详细说明,有兴趣的可以自行研究一下。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理