第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Selenium 僅在使用無頭 Chrome 時(shí)無法定位元素(Python)

Selenium 僅在使用無頭 Chrome 時(shí)無法定位元素(Python)

蕪湖不蕪 2023-10-31 15:58:48
我剛剛開始學(xué)習(xí) Selenium,需要使用云中的 jenkins 機(jī)器驗(yàn)證登錄網(wǎng)頁,該機(jī)器沒有 GUI。我設(shè)法在具有 UI 的系統(tǒng)上成功運(yùn)行該腳本。但是,當(dāng)我修改腳本以無頭運(yùn)行時(shí),它無法顯示無法定位元素。我的腳本如下:#!/usr/bin/env python3from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.support.ui import WebDriverWaitfrom webdriver_manager.chrome import ChromeDriverManagerimport timeimport argparsechrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--no-sandbox')chrome_options.add_argument('--window-size=1120, 550')chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')chrome_options.add_argument('--allow-running-insecure-content')driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_options)driver.implicitly_wait(5)lhip = '13.14.15.16'user = 'username'paswd = 'password'parser = argparse.ArgumentParser()parser.add_argument('-i', '--lh_ip',    type=str, metavar='', default=lhip,     help='Public IP of VM' )parser.add_argument('-u', '--usr',      type=str, metavar='', default=user,     help='Username for VM')parser.add_argument('-p', '--pwd',      type=str, metavar='', default=paswd,    help='Password for VM')args = parser.parse_args()lh_url = 'https://' + args.lh_ip + '/login/'driver.get(lh_url)try:    if driver.title == 'Privacy error':        driver.find_element_by_id('details-button').click()        driver.find_element_by_id('proceed-link').click()except:    passdriver.find_element_by_id('username').send_keys(args.usr)driver.find_element_by_id('password').send_keys(args.pwd)driver.find_element_by_id('login-btn').click()driver.implicitly_wait(10)try:    if driver.find_element_by_tag_name('span'):        print('Login Failed')except:    print('Login Successful')driver.close()由于我學(xué)習(xí)了大約一天的 Selenium,我可能會做一些相當(dāng)愚蠢的事情,所以如果有人告訴我我做錯了什么,我將非常感激。我用谷歌搜索了很多,嘗試了很多東西,但都沒有成功。另外,當(dāng)我只使用 id 作為用戶名時(shí),為什么它說“css 選擇器”?
查看完整描述

5 回答

?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個贊

我遇到了同樣的問題,它最初可以工作,但在我們使用 Selenium 的網(wǎng)站進(jìn)行更新后,它停止在無頭模式下工作,但繼續(xù)在非無頭模式下工作。經(jīng)過 2 天的研究網(wǎng)絡(luò)最深和最黑暗的深度以及大量的試驗(yàn)和錯誤,終于找到了問題所在。

我嘗試了網(wǎng)上列出的所有方法以及更多方法,但在我找到這個方法之前都沒有任何效果。

在無頭 chrome 模式下,用戶代理如下所示: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,如 Gecko)?HeadlessChrome?/60.0.3112.50 Safari/537.36

服務(wù)提供商更新了他們的代碼以識別 HeadlessChrome 部分,這會導(dǎo)致選項(xiàng)卡崩潰,進(jìn)而破壞 Selenium 用戶會話。

這導(dǎo)致上述問題在其中一個異常中觸發(fā)。

為了解決這個問題,我使用了一個名為 fake_headers 的插件(https://github.com/diwu1989/Fake-Headers):

from fake_headers import Headers


header = Headers(

? ? browser="chrome",? # Generate only Chrome UA

? ? os="win",? # Generate only Windows platform

? ? headers=False # generate misc headers

)

customUserAgent = header.generate()['User-Agent']


options.add_argument(f"user-agent={customUserAgent}")

雖然這只是解決方案的一半,因?yàn)槲抑幌胍?Windows 和 Chrome 標(biāo)頭,并且 fake_headers 模塊不包含最新的 Chrome 瀏覽器,并且列表中包含許多舊版本的 Chrome,如在此文件中所示 https:?// github.com/diwu1989/Fake-Headers/blob/master/fake_headers/browsers.py。我運(yùn)行 Selenium 的特定網(wǎng)站的某些功能僅適用于較新版本的 Chrome,因此當(dāng)舊版本的 Chrome 通過用戶代理標(biāo)頭傳遞時(shí),該網(wǎng)站上的某些功能實(shí)際上會停止工作。因此,我需要更新 fake_headers 模塊中的 browsers.py 文件,以僅包含我想要包含的 Chrome 版本。因此,我刪除了 Chrome 的所有舊版本,并創(chuàng)建了一個精選版本列表(每個版本都經(jīng)過單獨(dú)測試以在相關(guān)網(wǎng)站上運(yùn)行,并刪除了不能運(yùn)行的版本)。最終得到了以下列表,我可以對其進(jìn)行擴(kuò)展,但暫時(shí)還沒有。

chrome_ver?=?[
????'90.0.4430',?'84.0.4147',?'85.0.4183',?'85.0.4183',?'87.0.4280',?'86.0.4240',?'88.0.4324',?'89.0.4389',?'92.0.4515',?'91.0.4472',?'93.0.4577',?'93.0.4577']

希望這可以幫助人們減輕兩天的壓力和混亂。


查看完整回答
反對 回復(fù) 2023-10-31
?
Cats萌萌

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個贊

如果腳本在沒有無頭模式的情況下工作得很好,則窗口大小可能存在問題。除了指定 --no-sandbox 選項(xiàng)外,嘗試更改傳遞給網(wǎng)絡(luò)驅(qū)動程序的窗口大小

chrome_options.add_argument('--window-size=1920,1080')

這個窗口大小適合我的情況。

即使這不起作用,您可能需要添加之前回答的等待計(jì)時(shí)器,因?yàn)榕c UI 模式下的瀏覽器相比,無頭模式下的渲染工作方式不同。

無頭模式渲染參考 - https://www.toolsqa.com/selenium-webdriver/selenium-headless-browser-testing/


查看完整回答
反對 回復(fù) 2023-10-31
?
一只萌萌小番薯

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個贊

chrome_options.add_argument('--window-size=1920,1080') 這對我有用,謝謝



查看完整回答
反對 回復(fù) 2023-10-31
?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個贊

我也遇到過類似的情況。我在網(wǎng)上嘗試了很多解決方案,例如指定分辨率,但沒有任何效果,直到這:

self.chrome_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"')

所以看來你需要將UA添加到chrome選項(xiàng)中,這樣selenium驅(qū)動程序就不會在無頭模式下崩潰。


查看完整回答
反對 回復(fù) 2023-10-31
?
猛跑小豬

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個贊

我會以某種方式重構(gòu)代碼,直到元素出現(xiàn)在網(wǎng)頁上:


from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait


WebDriverWait(wd, 10).until(EC.presence_of_element_located((By.ID, 'username'))).send_keys(args.usr)

WebDriverWait(wd, 10).until(EC.presence_of_element_located((By.ID,'password'))).send_keys(args.pwd)

WebDriverWait(wd, 10).until(EC.presence_of_element_located((By.ID, 'login-btn'))).click()

通常,與某些條件結(jié)合使用WebDriverWait應(yīng)優(yōu)先于隱式等待或time.sleep()。這里詳細(xì)解釋一下原因。


其他需要仔細(xì)檢查的事情是元素是否具有用于搜索的 ID,以及這些元素是否位于 iframe 內(nèi)。


查看完整回答
反對 回復(fù) 2023-10-31
  • 5 回答
  • 0 關(guān)注
  • 552 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號