python Selenium 瀏覽器大小 顯示等待 模擬移動設備 禁止圖片加載 進程不銷毀 及其參數

作者: 魯智深 分類: Python 發布時間: 2020-01-15 01:03

selenium.獲取瀏覽器大小、設置瀏覽器位置、最大化瀏覽器

get_window_size()     獲取瀏覽器大小

1
2
3
4
5
# 將窗口大小實例化
size_Dict = driver.get_window_size()
# 打印瀏覽器的寬和高
print("當前瀏覽器的寬:", size_Dict['width'])
print("當前瀏覽器的高:", size_Dict['height'])

set_window_size()     設置瀏覽器大小

1
driver.set_window_size(width=500, height=500, windowHandle="current")

get_window_position()    獲取瀏覽器在屏幕上的坐標

1
2
3
4
5
6
# 將窗口位置實例化
position = driver.get_window_position()
# 打印窗口坐標
print(position)
print("瀏覽器所在位置的橫坐標:", position["x"])
print("瀏覽器所在位置的縱坐標:", position["y"])

set_window_position()    設置瀏覽器在屏幕的位置

1
2
3
# 設置窗口位置并打印位置坐標
driver.set_window_position(x=100, y=200)
print(driver.get_window_position())

maximize_window()    最大化瀏覽器

1
2
3
4
# 最大化瀏覽器并輸出瀏覽器的大小和位置坐標
driver.maximize_window()
print(driver.get_window_size())
print(driver.get_window_position())

Selenium中的“顯示等待”和“隱式等待”

顯示等待(常用)

顯示等待的代碼定義了等待條件,只有該條件觸發,才執行后續代碼。下面代碼最多等待 10 秒,超時后就拋出 TimeoutException。

1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()driver.get("http://somedomain/url_that_delays_loading")
try:    
    element = WebDriverWait(driver, 10).until(          
        EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:
    # 等待后執行的代碼
    # driver.quit()

隱式等待

隱式等待是在嘗試發現某個元素的時候,如果沒能立刻發現,就等待固定長度的時間。默認設置是0秒。一旦設置了隱式等待時間,它的作用范圍就是Webdriver對象實例的整個生命周期。

1
2
3
4
5
6
from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

Selenium+Chrome參數配置

1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 實例化一個啟動參數對象
chrome_options = Options()
# 無界面運行(無窗口)
chrome_options.add_argument('--headless')
# 啟動瀏覽器
driver = webdriver.Chrome(chrome_options=chrome_options)
# 請求百度首頁
driver.get('http://www.baidu.com')

其中的 –headless 就是一個啟動項參數

常用的啟動項參數如下所示

–user-data-dir=”[PATH]” 指定用戶文件夾User Data路徑,可以把書簽這樣的用戶數據保存在系統分區以外的分區。
–disk-cache-dir=”[PATH]“ 指定緩存Cache路徑
–disk-cache-size= 指定Cache大小,單位Byte
–first run 重置到初始狀態,第一次運行
–incognito 隱身模式啟動
–disable-javascript 禁用Javascript
–omnibox-popup-count=”num” 將地址欄彈出的提示菜單數量改為num個。我都改為15個了。
–user-agent=”xxxxxxxx” 修改HTTP請求頭部的Agent字符串,可以通過about:version頁面查看修改效果
–disable-plugins 禁止加載所有插件,可以增加速度??梢酝ㄟ^about:plugins頁面查看效果
–disable-javascript 禁用JavaScript,如果覺得速度慢在加上這個
–disable-java 禁用java
–start-maximized 啟動就最大化
–no-sandbox 取消沙盒模式
–single-process 單進程運行
–process-per-tab 每個標簽使用單獨進程
–process-per-site 每個站點使用單獨進程
–in-process-plugins 插件不啟用單獨進程
–disable-popup-blocking 禁用彈出攔截
–disable-plugins 禁用插件
–disable-images 禁用圖像
–enable-udd-profiles 啟用賬戶切換菜單
–proxy-pac-url 使用pac代理 [via 1/2]
–lang=zh-CN 設置語言為簡體中文
–disk-cache-dir 自定義緩存目錄
–disk-cache-size 自定義緩存最大值(單位byte)
–media-cache-size 自定義多媒體緩存最大值(單位byte)
–bookmark-menu 在工具 欄增加一個書簽按鈕
–enable-sync 啟用書簽同步
–single-process 單進程運行Google Chrome
–start-maximized 啟動Google Chrome就最大化
–disable-java 禁止Java

官方網站參考:https://sites.google.com/a/chromium.org/chromedriver/capabilities

Selenium+Chrome模擬移動設備

1
2
3
4
5
6
# 通過設置user-agent,用來模擬移動設備
# 比如模擬 android QQ瀏覽器
options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')

# 模擬iPhone 6
options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"')

Selenium+Chrome禁止圖片加載的參數配置

1
2
3
4
5
6
# 禁止圖片的加載
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)

解決chromedriver chrome進程不銷毀問題

selenium 的內存清理不干凈已經是老問題了,網上也有很多方法比如定時 shell 命令清理,此方法在不同的操作系統就要寫不同的執行代碼很麻煩。

經過1天不斷測試,通過 driver.close() 和 driver.quit() 清理是比較有效的。

1
2
3
4
5
6
7
def stop_driver(self, driver):
        try:
            driver.close()
            driver.quit()
        except Exception as e:
            print('結束瀏覽器進程報錯:{}'.format(e))
            pass

啟動開發者模式

1
2
# 此步驟很重要,設置為開發者模式,防止被各大網站識別出來使用了Selenium
chromeOptions.add_experimental_option('excludeSwitches', ['enable-automation'])

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

發表評論

電子郵件地址不會被公開。 必填項已用*標注

中了亿元大奖 平特一肖怎么玩最稳 贵州11选5组三走势图 浙江11选五5开奖结果遗漏 内蒙古11选5开奖结果查询一定牛 宁夏11选五工具 河南11选5奖金 香港赛马会最新消息 11选5开奖结果走势图 体彩安徽11选5开奖结果 曾到香港最准单双王