網頁自動化
1.環境配置
1.1 python3安裝,去官網安裝,要安裝大的,小的安裝包可能沒有script文件目錄,沒有安裝pip
1.2 pycharm安裝,安裝后配置python版本,以及知道如何添加安裝模塊
1.3 selenium安裝 在pycharm的終端terminal中執行pip install selenium
1.4 安裝瀏覽器內核驅動webdriver,chrome的驅動chromedriver.exe,注意自己的瀏覽器對應驅動版本,將exe程序放到python的script目錄下
2.瀏覽器啟動
2.1 普通方式啟動
# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
2.2 無界面啟動
# -*- coding: utf-8 -*-
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('disable-gpu')
driver = webdriver.Chrome(options=chrome_options)
driver.get('http://www.baidu.com')
我的chrome未實現,因為版本是49,比較老的版本,在widows系統中使用無界面版本需要chrome版本60+。
2.3 加載配置啟動瀏覽器
因為老版本有許多功能不支持,以免影響后面的實驗效果,所以將chrome的版本升到60+。在升級之前先備份老版本網頁書簽,又想到老版本的書簽網頁有些網頁是記錄登錄狀態的,所以備份書簽url和賬號密碼,還需要准備相應的webdriver.老版本是zip文件解壓后直接使用,不是exe安裝包,所以啟動時需配置binary_location,如下:
# -*- coding: utf-8 -*-
from selenium import webdriver
options = webdriver.ChromeOptions()
options.binary_location = r"D:\用戶目錄\下載\Chrome6103163100x86\GoogleChrome_61.0.3163.100_x86\ChromePortable\ChromePortable.exe"
driver = webdriver.Chrome(options=options)
driver.get('https://www.cnblogs.com/qzdlp/')
再來實現無界面啟動:
# -*- coding: utf-8 -*-
from selenium import webdriver
options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('disable-gpu')
options.binary_location = r"D:\用戶目錄\下載\Chrome6103163100x86\GoogleChrome_61.0.3163.100_x86\ChromePortable\ChromePortable.exe"
driver = webdriver.Chrome(options=options)
driver.get('https://www.cnblogs.com/qzdlp/')
print(f"browser text = {driver.page_source}")
driver.quit()
輸入賬號和密碼啟動:
uname = 'xxxx'
passd = 'xxxx'
driver.find_element_by_class_name('uname').send_keys(uname)
sleep(1)
driver.find_element_by_class_name('passd').send_keys(passd)
sleep(1)
driver.find_element_by_class_name('tijiao').click()
sleep(1)
code
怎么加cookie?
driver = webdriver.Chrome()
# 要先訪問一次這個域名
driver.get('https://aso100.com')
for item in cookie_list: driver.add_cookie({
'domain': '.aso100.com',
'name': item['name'],
'value': item['value'],
'path': '/',
'expires': None
})
driver.get('https://aso100.com/account/setting/type/dataCenter')
input('是否有效')
driver.close()
driver.quit()
3.定位元素:(以baidu.com為例)
根據id定位 find_element_by_id(‘id’)
driver.find_element_by_id('kw').send_keys('selenium')
name定位 find_element_by_name()
driver.find_element_by_name('wd').send_keys('selenium2')
class定位find_element_by_class_name()
driver.find_element_by_class_name('s_ipt').send_keys('123')
link定位:find_element_by_link_text()
driver.find_element_by_link_text('2')
partial link定位:find_element_by_partial_link_text()
driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
tag定位:find_element_by_tag_name()
elements = driver.find_element_by_tag_name('input')
這樣定位得是第一個第一個input,如果想定位到輸入框有一個思路,使用driver.find_elements_by_tag_name('input')返回一個列表,再蔣輸入框的input取出來。
driver.find_elements_by_tag_name('input')[7].send_keys('3333')
css定位:find_element_by_css_selector()
driver.find_element_by_css_selector("#kw").send_keys("selenium")
4.含有空格的解決方法
4.1 先來了解一下driver.switch_to.frame(),這個可以定位到指定的框架,取框架內的內容
4.2 空格的解決方案,定位一半或采用css的方式(CSS空格使用.代替)
driver.find_element_by_class_name("dlemail").send_keys("yoyo")
driver.find_element_by_css_selector(".j-inputtext.dlemail").send_keys("yoyo")
5. 等待分為三種強制等待,隱形等待,顯性等待
5.1 強制等待 就是這樣死板的time.sleep(1)
5.2 隱形等待implicitly_wait(),智能一點,就是設置一個最大時間,如果上一步加載完成,則下一步,否則把時間用完
5.3 顯性等待
WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
6.瀏覽器操作
瀏覽器大小操作分為瀏覽器最大化、最小化、指定大小
driver.maximize_window()
driver.minimize_window()
driver.set_window_size(480, 800)
瀏覽器前進和后退操作
driver.forword()和driver.back()
7.操作對象的方法
操作對象的方法如點擊某個連接、發送內容、清楚內容、提交、獲取文本
Click send_keys clear submit text
8.鍵盤事件
什么時候用到,比如登錄框時,可以通過find_element找到提交按鈕,click一下。也可以輸入賬號密碼后,按下回車鍵。
這種類型可以划分為單鍵的鍵盤事件,相對的還有一種組合鍵的鍵盤事件,比如復制和粘貼,以下2個例子說明:
單鍵提交,以百度登錄為例:
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
options = webdriver.ChromeOptions()
options.binary_location = r"D:\用戶目錄\下載\Chrome6103163100x86\GoogleChrome_61.0.3163.100_x86\ChromePortable\ChromePortable.exe"
driver = webdriver.Chrome(options=options)
driver.get('https://www.baidu.com/')
driver.find_element_by_link_text('登錄').click()
sleep(2)
driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click()
sleep(1)
driver.find_element_by_id('TANGRAM__PSP_10__userName').send_keys('11222')
driver.find_element_by_id('TANGRAM__PSP_10__password').send_keys('22222')
sleep(1)
driver.find_element_by_id('TANGRAM__PSP_10__password').send_keys(Keys.ENTER)
組合鍵:
#ctrl+a 全選輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
9鼠標事件
鼠標事件包括右鍵、雙擊、拖動、移動鼠標到某個元素上,需要導入ActionChains類
from selenium.webdriver.common.action_chains import ActionChains
ActionChains類有5個方法
perform() 執行所有ActionChains 中存儲的行為;
context_click() 右擊;
double_click() 雙擊;
drag_and_drop() 拖動;
move_to_element() 鼠標懸停。
除了以上的鼠標操作,還有一種常用的click()點擊類型context_click()
雙擊:
#定位到要雙擊的元素
qqq =driver.find_element_by_xpath("xxx")
#對定位到的元素執行鼠標雙擊操作
ActionChains(driver).double_click(qqq).perform()
拖曳:
#定位元素的原位置
element = driver.find_element_by_name("source")
#定位元素要移動到的目標位置
target = driver.find_element_by_name("target")
#執行元素的移動操作
ActionChains(driver).drag_and_drop(element, target).perform()
9.多層框架/層級定位的問題
browser.switch_to_frame("f1")
browser.switch_to_window("f1")
10.判斷常與顯性等待配合使用
title_is: 判斷當前頁面的title是否精確等於預期
title_contains: 判斷當前頁面的title是否包含預期字符串
presence_of_element_located:判斷某個元素是否被加到了dom樹里,並不代表該元素一定可見
visibility_of_element_located:判斷某個元素是否可見.可見代表元素非隱藏,並且元素的寬和高都不等於0
visibility_of:跟上面的方法做一樣的事情,只是上面的方法要傳入locator,這個方法直接傳定位到的element就好了
presence_of_all_elements_located:判斷是否至少有1個元素存在於dom樹中。舉個例子,如果頁面上有n個元素的class都是'column-md-3',那么只要有1個元素存在,這個方法就返回True
text_to_be_present_in_element:判斷某個元素中的text是否包含了預期的字符串
text_to_be_present_in_element_value:判斷某個元素中的value屬性是否包含了預期的字符串
frame_to_be_available_and_switch_to_it:判斷該frame是否可以switch進去,如果可以的話,返回True並且switch進去,否則返回False
invisibility_of_element_located:判斷某個元素中是否不存在於dom樹或不可見
element_to_be_clickable:判斷某個元素中是否可見並且是enable的,這樣的話才叫clickable
staleness_of:等某個元素從dom樹中移除,注意,這個方法也是返回True或False
element_to_be_selected:判斷某個元素是否被選中了,一般用在下拉列表
element_selection_state_to_be:判斷某個元素的選中狀態是否符合預期
element_located_selection_state_to_be:跟上面的方法作用一樣,只是上面的方法傳入定位到的element,而這個方法傳入locator
alert_is_present:判斷頁面上是否存在alert,這是個老問題,很多同學會問到
Python Webdriver Exception速查表
Xpath&Css定位方法速查表
https://www.jianshu.com/p/1531e12f8852
代碼美化工具
實例:https://www.cnblogs.com/qzdlp/p/12168286.html