[英]Python Selenium: send keys to tag 'input type="hidden" '
我嘗試使用我的憑據登錄到此 web 頁面。
https://www.oddsportal.com/login
我能夠獲得“用戶名”和“密碼”輸入框,但無法發送數據。
Selenium 定位元素(通過“id”或其他方式),但在嘗試發送值或按回車時出現問題:“AttributeError: 'NoneType' object has no attribute 'click'” “AttributeError: 'NoneType' object has no attribute '發送密鑰'”
我也嘗試過查找、xpath、actionchain 和 execute_script。
任何線索如何點擊和發送密鑰?
TVM。
我添加了一些嘗試過的代碼:
us = driver.find_element_by_xpath('//input[@type="hidden"]')
print(us)
output:
<selenium.webdriver.remote.webelement.WebElement (session="84a2b7c7a5e9eda5e562d7a8f17ab749", element="1201c113-012c-4918-84cf-8011b696a5ff")>
我也試過:
us = driver.find_element(By.ID, "login-username-sign")
print(us)
output:
<selenium.webdriver.remote.webelement.WebElement (session="b8e6d51511c6cad8d24cf7946c46865f", element="004a920b-752d-4280-8dd1-5c8f330efa74")>
我試過了:
us = driver.find_element(By.ID, "login-username-sign")
us.send_keys("1234")
output:
ElementNotInteractableException: Message: element not interactable
(Session info: chrome=109.0.5414.74)
等等。
“關於人工登錄的信息”:要手動登錄,您必須將 cursor 放在文本框上,單擊然后鍵入。 此操作在 Selenium 下失敗(單擊並鍵入)(我沒有點擊它,但我認為 Selinium 確實獲得了對象)。
HTML:
<form action="https://www.oddsportal.com/userLogin" method="post" class="flex flex-col flex-1 mt-[10px]">
<input type="hidden" name="_token" value="PhbLpoaq9vnNILGD4H6YYO7kFAoq2CUnT606hOHO">
<input type="hidden" name="referer">
<div class="item">
<div class="title">
<label for="login-username-sign" class="mb-2 text-xs text-black-main">Username</label>
<span class="required" title="required item">*</span>
</div>
<div>
<input class="int-text w-[300px] min-sm:w-[340px] pl-4 h-10 mb-[14px] border border-solid border-box border-black-main border-opacity-20 hover:input-hover" type="text" id="login-username-sign" name="login-username" size="25" required="">
</div>
</div>
<div class="item">
<div class="title">
<label for="login-password-sign" class="mb-2 text-xs text-black-main">Password</label>
<span class="required" title="required item">*</span>
</div>
<div class="flex h-10 bg-white-main">
<input class="int-text w-[300px] min-sm:w-[340px] pl-4 h-10 mb-[14px] border-solid border border-black-main border-opacity-20 hover:input-hover" type="password" id="login-password-sign" name="login-password" autocomplete="on" size="25" required="">
<div class="grid absolute left-[90%] items-center justify-center h-10 w-8"><div onclick="switchVisibility(this, 'login-password-sign')" class="w-6 h-5 bg-center bg-no-repeat bg-cover cursor-pointer passlog bg-eye_icon !bg-off_eye_icon">
</div>
</div>
</div>
由於我工作計算機的安全策略,我無法打開該鏈接,但我可以肯定您的問題是由錯誤的定位器引起的。
“AttributeError: 'NoneType' object 沒有屬性 'click'”
和
“AttributeError: 'NoneType' object 沒有屬性 'send_keys'”
意味着你實際上並沒有得到你試圖點擊/發送鍵的 web 元素。
也無法將帶有 Selenium 的鍵(文本)發送到帶有“input type="hidden"”的元素。 Selenium 模仿人類用戶 GUI 操作。 作為人類用戶,您不能將文本插入隱藏元素。
該頁面上有 2 個登錄名 forms。 您的 Selenium 代碼失敗,因為它找到了第一個,除非您按頁面右上角的login
,否則它是隱藏的:
如果您在 chrome devtools 中按 F12 並嘗試搜索這樣的元素: document.querySelectorAll("div.pt-5 form #login-username-sign")
它將找到兩個登錄字段。 這是一個“css”選擇器,您可以在 python 代碼中使用它。 由於它看起來“從上到下”,最簡單的方法是:
document.querySelectorAll("div.pt-5 form #login-username-sign")[1]
這是在 devtools 中對其工作原理的測試:
總結一下 - 你應該能夠找到它:
find_elements(By.CSS_SELECTOR, "div.pt-5 form #login-username-sign")[1]
find_elements
返回與該選擇器匹配的所有元素的列表(我們將得到 2)。 我們的登錄名是 DOM 中的第二個,因此我們從列表中選擇[1]
。
首先,您必須使用用戶名、密碼 email 和國家名稱url填寫空白表格,手動注冊網站創建帳戶
然后 go 使用您想要的登錄名 url並運行 selenium 代碼並從 selenium 自動瀏覽器中查看真實場景。 現在您會注意到登錄 url 將要求僅使用用戶名和密碼填寫表格,您必須使用您注冊的用戶名和密碼並單擊登錄按鈕。 好吧。 不,首先,接受 cookies。然后填寫登錄表格。
您必須應用 JavaScript 執行才能單擊登錄按鈕,否則將拋出 ClickIntercept 異常。 因為登錄按鈕與其他動態元素交互。
腳本:
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
import time
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
URL ='https://www.oddsportal.com/login'
driver.get(URL)
time.sleep(5)
cookie_btn = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '(//*[@id="onetrust-button-group"]/button)[1]'))).click()
UserName = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '(//*[@id="login-username-sign"])[2]'))).send_keys('Akij')#Your registered account's username
PassWord = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#login-password-sign'))).send_keys('789456rtU') #Your registered account's password
LogIn = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '(//*[@name="login-submit"])[2]')))
#You have to apply JavaSript execution in order to click on Login button, Otherwise it will throw ClickIntercept Exception
#Because Login button interacts with other dynamic element.
LogIn_click = driver.execute_script("arguments[0].click();", LogIn)
time.sleep(1)
看下面output:
你已經足夠接近了。 但是您嘗試使用的定位器策略,即
us = driver.find_element(By.ID, "login-username-sign")
標識HTML DOM中的兩 (2) 個元素。 其中第一個是隱藏的,因為第二個匹配元素是您想要的元素。
要簡化識別用戶名和密碼字段的任務,您可以單擊頁面右上角的登錄元素,這會在模式對話框中打開用戶名和密碼字段,您可以使用以下定位器識別所需的元素策略:
代碼塊:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC driver.get('https://www.oddsportal.com/login') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#.netrust-accept-btn-handler"))).click() WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='flex gap-3']//div[contains(@class, 'loginModalBtn') and starts-with(., 'Login')]"))).click() WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#loginDiv form[action='https://www.oddsportal.com/userLogin'] input#login-username-sign"))).send_keys("daniel2014") driver.find_element(By.CSS_SELECTOR, "div#loginDiv form[action='https://www.oddsportal.com/userLogin'] input#login-password-sign-m").send_keys("daniel2014")
瀏覽器快照:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.