Selenium是一个用于Web应用程序测试的工具,很多时候可以拿来做自动化的功能,解放一些重复的事情,比如自动注册、登录、获取信息、处理报表等等,都是可以自己去设计一个流程即可,使用它,先从安装和配置开始!!
pip install Selenium
由于是用于web应用,需要下载浏览器不同版本对应的驱动(ChromeDriver),以Chrome为例,先查看版本: chrome://version/
Google Chrome 94.0.4606.71 (正式版本) (64 位) (cohort: Stable)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 89
Current browser version is 94.0.4606.71 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
查看到我的Chrome版本是94.0.4606(中间默认就升级了),所以以前下载的 ChromeDriver版本就低了,需要下载对应的版本:
ChromeDriver Mirrorhttps://npm.taobao.org/mirrors/chromedriver/
或者使用Firefox浏览器:https://github.com/mozilla/geckodriver/releases
配置环境变量:
比如: E:\MyChromeDriver, 把下载好的放进这个目录下
设置环境变量:系统变量–>Path,将“ E:\MyChromeDriver”目录添加到Path的值中即可
安装和配置好之后就可以使用它了,使用它最关键在于如何定位元素
定位一个元素 | 定位多个元素 | 说明 |
find_element_by_id | find_elements_by_id | 通过元素id定位 |
find_element_by_name | find_elements_by_name | 通过元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | find_elements_by_link_text | 通过完整超链接的文本定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过部分链接的文本定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签定位 |
find_element_by_class_name | find_elements_by_class_name | 通过类名进行定位 |
find_element_by_css_selector | find_elements_by_css_selector | 通过css选择器进行定位 |
例,通过自动打开百度,自定义搜索并分别点开链接查看文章
from selenium import webdriver
from time import sleep
def main():
mydriver = 'E:\MyChromeDriver\chromedriver.exe'
browser = webdriver.Chrome(executable_path = mydriver)
browser.get('https://www.baidu.com')
browser.set_window_size(1800,1200)
browser.find_element_by_id("kw").send_keys("日本核污水")
browser.find_element_by_id("su").click()
sleep(2)#有时需要停留下,不然内容还没有出来,定位不到就报错
#print(browser.title)
#print(browser.find_element_by_class_name("nums_text").text)
titles = browser.find_elements_by_xpath('//div/h3/a')
for t in titles:
print(t.text)
ts=browser.find_element_by_link_text(t.text)
ts.click()
sleep(1)
#print(browser.find_element_by_xpath("//span[@class='nums_text']").text)
sleep(5)
#browser.quit()
if __name__ == '__main__':
main()
如果是有框架的情况,需要进行切换才能定位,比如自动登录126邮箱
from selenium import webdriver
from time import sleep
def main():
mydriver = 'E:\MyChromeDriver\chromedriver.exe'
browser = webdriver.Chrome(executable_path = mydriver)
browser.get('https://126.com')
browser.set_window_size(1800,1200)
sleep(2)
xf = browser.find_element_by_xpath("//div[@id='loginDiv']/iframe")#由于iframe的id是动态的,所以先从它的上级元素来定位到本身
browser.switch_to.frame(xf)
browser.find_element_by_name("email").send_keys("tony")
browser.find_element_by_name("password").send_keys("12345678")
browser.find_element_by_id("dologin").click()
browser.switch_to.default_content()
sleep(5)
#browser.quit()
if __name__ == '__main__':
main()
send_keys模拟键盘的一些示例
send_keys(Keys.BACK_SPACE) | 删除键 |
send_keys(Keys.SPACE) | 空格键 |
send_keys(Keys.TAB) | 制表键 |
send_keys(Keys.ESCAPE) | 回退键(Esc键) |
send_keys(Keys.ENTER) | 回车键 |
send_keys(Keys.CONTROL,‘a’) | 全选(Ctrl+A) |
send_keys(Keys.CONTROL,‘c’) | 复制(Ctrl+C) |
send_keys(Keys.CONTROL,‘x’) | 剪切(Ctrl+X) |
send_keys(Keys.CONTROL,‘v’) | 粘贴(Ctrl+V) |
send_keys(Keys.F1…Fn) | 功能键 F1…Fn |
另外有些网站禁止使用Selenium,可以通过js的window.navigator.webdriver来判断,如果是true就是代表通过Selenium在访问
熟悉js的可以使用下面这个来修改属性为false:
Object.defineProperties(navigator, {webdriver:{get:()=>false}});
不想让浏览器显示“chrome正受到自动测试软件的控制”信息,可以通过选项进行隐藏
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(options=option)
browser.get('https://126.com')
如果是一些隐藏的标签或界面,这个时候可以模拟鼠标操作,比如百度的设置下面的搜索设置,就需要鼠标放上去再显示出来,下面设置每页20条的示例
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
def main():
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])#隐藏“chrome正受到自动测试软件的控制”
browser = webdriver.Chrome(options=option)
browser.get('https://www.baidu.com')
browser.set_window_size(1800,1200)
sleep(1)
e1= browser.find_element_by_id("s-usersetting-top")#找到“设置”
ActionChains(browser).move_to_element(e1).perform()#鼠标悬停在“设置”位置
e2=browser.find_element_by_link_text("搜索设置")
e2.click()
sleep(1)
e3=browser.find_element_by_id('nr_2')#每页20条的设置保存
e3.click()
e4=browser.find_element_by_class_name('prefpanelgo')
e4.click()
sleep(1)
browser.switch_to.alert.accept()#接受提示框
browser.find_element_by_id("kw").send_keys("日本核污水")
browser.find_element_by_id("su").click()
sleep(2)
titles = browser.find_elements_by_xpath('//div/h3/a')
for t in titles:
print(t.text)
ts=browser.find_element_by_link_text(t.text)
ts.click()
sleep(1)
sleep(50)
#browser.quit()
if __name__ == '__main__':
main()
对Cookies的操作
for cookie in browser.get_cookies():
print('%s----%s' %(cookie['name'],cookie['value']))
kv={'name':"MyName",'value':'Tony'}
browser.add_cookie(kv)#添加键值对
browser.delete_cookie('GUEST_LANGUAGE_ID')#删除这个键值
for cookie in browser.get_cookies():
print('%s----%s' %(cookie['name'],cookie['value']))
browser.delete_all_cookies()#删除全部的cookies
对js脚本的执行操作
#执行js脚本,滚动条定位到x,y坐标位置
browser.execute_script("window.scrollTo(100,800);")
browser.execute_script("alert('你好,中国')")
截图操作
imgname=time.strftime("%Y%m%d%H%M%S", time.localtime())
browser.get_screenshot_as_file("D:\\"+imgname+".png")