簡體   English   中英

Python Selenium:將密鑰發送到標簽“input type="hidden"”

[英]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]

  1. 首先,您必須使用用戶名、密碼 email 和國家名稱url填寫空白表格,手動注冊網站創建帳戶

  2. 然后 go 使用您想要的登錄名 url並運行 selenium 代碼並從 selenium 自動瀏覽器中查看真實場景。 現在您會注意到登錄 url 將要求僅使用用戶名和密碼填寫表格,您必須使用您注冊的用戶名和密碼並單擊登錄按鈕。 好吧。 不,首先,接受 cookies。然后填寫登錄表格。

  3. 您必須應用 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:

輸出-01

輸出-02

你已經足夠接近了。 但是您嘗試使用的定位器策略,即

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM