python學習筆記——selenium / phantomjs

基本操作

from selenium import webdriver

#————————打開網頁
b = webdriver.Chrome()#打開瀏覽器
b.get('https://www.baidu.com')
title = b.title #獲得網頁title
print(title)
www = b.current_url  #返回打開的網址
print(www)

#————————定位元素
ele = b.find_element_by_id('kw') #根據id定位元素
ele = b.find_element_by_name('wd') #根據name定位元素
ele1 = b.find_element_by_class_name('')#根據class屬性定位元素
ele2 = b.find_element_by_tag_name('input') #根據標籤名定位元素
ele3 = b.find_element_by_link_text('帳號密碼登錄') #根據text定位元素
ele4 = b.find_element_by_partial_link_text('賬號')#模糊text定位元素
ele5 = b.find_element_by_css_selector('')#根據css定位元素

#———————常用操作
ele.clear() #清空
ele.send_keys('李小龍') #模擬鍵盤輸入
ele.back()#返回上一級
ele1.send_keys('劉德華')#模擬鍵盤輸入
b.maximize_window()#最大化窗口
b.close()  # 關閉當前窗口
b.quit() #關閉瀏覽器

#———————如果需要定位的元素在frame內,需要先進入frame
b.switch_to_frame('ptlogin_iframe')#先定位到frame裏面

#———————遇到新標籤窗口
now_handle = b.current_window_handle #先拿到原來窗口的句柄
print(now_handle)
all_handles = b.window_handles #拿到全部窗口的句柄
for handle in all_handles:  #比對句柄
    print(handle)
    if handle != now_handle:
        b.switch_to_window(handle)  #跳轉到新窗口
b.close() #關閉當前窗口
b.quit()#關閉瀏覽器





Selenuim+Python之元素定位總結及實例說明

點擊打開鏈接

Python+Selenium定位不到元素常見原因及解決辦法


測試過程中,遇到原頁面打開了新的頁面的問題,用獲取窗口句柄的方法來解決:

now_handle = driver.current_window_handle #得到當前窗口句柄
driver.find_element_by_id("baidu").click()
all_handles = driver.window_handles #獲取所有窗口句柄

for handle in all_handles:
if handle != now_handle:
driver.switch_to_window(handle)
driver.find_element_by_id("kw").send_keys('python')
driver.find_element_by_id("su").click()
self.driver.implicitly_wait(30)
driver.switch_to_window(now_handle) #返回window.html

怎麼等待頁面元素加載完成——等待的方法

1 / 強制等待

用time.sleep()來強制等待多長時間

2 / 隱性等待

implicitly_wait(xx)

格式:

driver.implicitly_wait(30)# 隱性等待,最長等30秒

隱形等待是設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然後執行下一步。注意這裏有一個弊端,那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉,纔會執行下一步,但有時候頁面想要的元素早就在加載完成了,但是因爲個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步,我想等我要的元素出來之後就下一步怎麼辦?有辦法,這就要看selenium提供的另一種等待方式——顯性等待wait了。

3 / 顯性等待

WebDriverWait,配合該類的until()和until_not()方法,就能夠根據判斷條件而進行靈活地等待了。

它主要的意思就是:程序每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然後拋出TimeoutException。

格式:

先導入模塊:

from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)


某論壇自動簽到小練習:

#某論壇的自動簽到小練習

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://www.sketchupbar.com/forum.php')
assert 'SketchUp'in driver.title
ele = driver.find_element_by_class_name('vm')
print(ele)
ele.click()
#由於發現正常的賬號登陸,需要用滑條解鎖認證,轉而考慮用qq關聯賬號登陸。避過滑條。
driver.implicitly_wait(2) #隱性等待,最長2秒
driver.switch_to_frame('ptlogin_iframe')#先定位到frame裏面
ele = driver.find_element_by_id('switcher_plogin') #定位到frame裏面之後再定位具體元素
print(ele)
ele.click()
username = driver.find_element_by_id('u') #定位賬號
username.send_keys('xxxxxxxxx') #輸入賬號
password = driver.find_element_by_id('p') #定位密碼
password.send_keys('xxxxxxxxx') #輸入密碼
password.click()
enter = driver.find_element_by_id('login_button') #定位點擊授權登陸
enter.click()
driver.implicitly_wait(10)#隱性等待,最長10秒
font = driver.find_element_by_class_name('font') #定位簽到關鍵字
now_handle = driver.current_window_handle #獲取當前窗口句柄
print(now_handle)
font.click()
all_handles = driver.window_handles #獲取全部窗口句柄
for handle in all_handles:
    print(handle)
    if handle != now_handle:
        driver.switch_to_window(handle) #跳轉到新標籤窗口
try:
    jd = driver.find_element_by_id('JD_sign') #在新標籤窗口進行簽到操作
    jd.click()
    print('簽到成功!!!')
    driver.quit()  # 關閉瀏覽器
except:
    print('已經簽到過啦!!!!')
    driver.quit()  # 關閉瀏覽器


xpath



模擬鼠標和輸入事件

ActionChains 類,用於生成模擬用戶行爲

1 / 導入

from selenium.webdriver.common.action_chains import ActionChains
2 / 生成模擬用戶行爲對象

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get('http://www.maiziedu.com/')
ActionChains(driver) #生成模擬用戶行爲對象。driver就是生成的瀏覽器句柄
3 / perform() 執行存儲的行爲


from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get('http://www.maiziedu.com/')
ele = driver.find_element_by_link_text('企業直通車')
ActionChains(driver).move_to_element(ele).perform() #生成模擬用戶行爲對象並移動到元素上。driver就是生成的瀏覽器句柄
sub_ele = driver.find_element_by_link_text('軟件測試') #再在這個彈出頁面中定位元素


處理Alter對象


比較詳細用法的一篇文章:

點擊打開鏈接


__________________________________________________________________________________________________

PhantomJs

講解PhantomJs配置比較詳細的一個博客點擊打開鏈接

PhantomJs文檔說明點擊打開鏈接

官方文檔 點擊打開鏈接

配置headers 和proxy 點擊打開鏈接

擴展閱讀 點擊打開鏈接

selenium支持的各種driver 點擊打開鏈接

phantomjs設置請求頭 點擊打開鏈接

phantomjs設置請求頭的小代碼:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.proxy import ProxyType
from headers import get_headers

dcap = dict(DesiredCapabilities.PHANTOMJS)
# #設置請求頭
#dcap["phantomjs.page.settings.userAgent"]=("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3")
dcap["phantomjs.page.settings.userAgent"] = (get_headers().get('User_Agent'))  #隨機獲取請求頭
#不載入圖片
dcap["phantomjs.page.settings.loadImages"] = False

#設置代理

#打開帶配置的瀏覽器
driver = webdriver.PhantomJS(desired_capabilities=dcap)
#driver.get('http://1212.ip138.com/ic.asp')
#driver.get('https://httpbin.org/get?show_env=1')
driver.get('http://www.myip.cn/judge.php')
# driver.get_screenshot_as_file('01.png')
print(driver.page_source)
driver.quit()


phantomjs超時設置:

  1.     # 設置10秒頁面超時返回,類似於requests.get()的timeout選項,driver.get()沒有timeout選項  
  2.     # 以前遇到過driver.get(url)一直不返回,但也不報錯的問題,這時程序會卡住,設置超時選項能解決這個問題。  
  3.     driver.set_page_load_timeout(20)  
  4.     # 設置10秒腳本超時時間  
  5.     driver.set_script_timeout(20)  

phantomjs設置代理

點擊打開鏈接

知乎上的這篇文章比較細,記錄下來

作者:客從何處來
鏈接:https://www.zhihu.com/question/29207713/answer/124956873
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

# 不使用代理代打開ip138
browser=webdriver.PhantomJS(PATH_PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')
print('1: ',browser.session_id)
print('2: ',browser.page_source)
print('3: ',browser.get_cookies())

# 利用DesiredCapabilities(代理設置)參數值,重新打開一個sessionId,我看意思就相當於瀏覽器清空緩存後,加上代理重新訪問一次url
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.MANUAL
proxy.http_proxy='1.9.171.51:800'
# 將代理設置添加到webdriver.DesiredCapabilities.PHANTOMJS中
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')
print('1: ',browser.session_id)
print('2: ',browser.page_source)
print('3: ',browser.get_cookies())

# 還原爲系統代理
proxy=webdriver.Proxy()
proxy.proxy_type=ProxyType.DIRECT
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')

通過輸出sessionid、cookies,可以發現,這兩者都改變了。如果你要保留第一次訪問的cookies,需要自己獲取第一次cookies,然後在第二次訪問前先delete_all_cookies, 然後add_cookie ,不要直接add_cookie,不然會產生兩個name一樣的cookie。

add_cookie時,phantomjs需要name/value/domain/path 寫全(firefox只需要name和value),不然在2.11phantomjs中會發生異常"selenium.common.exceptions.WebDriverException: Message: You may only set cookies for the current domain"

設置phantomjs代理Ip

#這個小程序用來示例設置phantomjs的proxy

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType

#未使用代理打開ip138
browser = webdriver.PhantomJS()
browser.get('http://1212.ip138.com/ic.asp')
print('1:',browser.session_id)
print('2:',browser.page_source)
print('3:',browser.get_cookies())

#使用代理
proxy = webdriver.Proxy()
proxy.proxy_type =ProxyType.MANUAL
proxy.http_proxy = '61.191.173.31:808'

#將代理設置添加到webdriver.DesiredCapabilities.PHANTOMJS中
proxy.add_to_capabilities(webdriver.DesiredCapabilities.PHANTOMJS)
browser.start_session(webdriver.DesiredCapabilities.PHANTOMJS)
browser.get('http://1212.ip138.com/ic.asp')
print('1:',browser.session_id)
print('2:',browser.page_source)
print('3:',browser.get_cookies())



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章