0

我正在嘗試使用Python在selenium和Chrome中登錄到網站。我可以找到用戶和密碼字段以及按鈕。我唯一不能做的就是用所有的字符串填充密碼字段。它寫一個子字符串,長度各不相同。Send_keys()不會發送完整的字符串

我的代碼

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 

browser=webdriver.Chrome(r"C:\Users\Visente\Desktop\Pablito Python\chromedriver.exe") 

urlbet='https://www.bet365.es/?&cb=103265469#/HO/' 

browser.get(urlbet) 

sport=WebDriverWait(browser, 10).until(
     EC.presence_of_element_located((By.XPATH,'//*[@id="dv1"]/a'))) 

sport.click() 

user=WebDriverWait(browser, 
10).until(EC.presence_of_element_located((
By.XPATH,'/html/body/div[1]/div/div[1]/div/div[1]/div[2]/div/div[1]/input')))  

passw=browser.find_element_by_xpath(
'/html/body/div[1]/div/div[1]/div/div[1]/div[2]/div/div[2]/input[1]')  


user.send_keys('my_user') 
passw.send_keys('password') 

submit=browser.find_element_by_xpath(
'/html/body/div[1]/div/div[1]/div/div[1]/div[2]/div/div[2]/button')` 

submit.click() 

因此,簡而言之,對變量passw其中y使用send_keys行()不寫密碼的全長和我不知道爲什麼。 順便說一下,如何獲取我剛剛用sed_keys()發送的文本,以便知道正在傳遞的內容以及字符串中缺少的內容?

+0

你打算怎麼做?請記住,在發送第一個字符後,x_path變長,以便在input [2] innstead of input [1] – puppet

回答

0

你不應該在你選擇的字段中輸入密碼。正如您在評論中指出的那樣,xpath將從input[1]切換到input[2]。後者是你應該輸入密碼的地方。我不明白當您嘗試在那裏發送密鑰時xpath改變的機制,但它確實如此。根據它的更改速度,從0到幾個字符的任何內容都將被髮送到錯誤的輸入,這就解釋了爲什麼密碼字段以密碼的子字符串結尾。

從html,我們可以看到有3個輸入字段,全部屬於'hm-Login_InputField'類。

<div class="hm-Login "> 
    <div class="hm-Login_UserNameWrapper "> 
     <input type="text" class="hm-Login_InputField "> 
     <div class="hm-Login_InputText " style=""> 
      Registrarse 
     </div> 
    </div> 
    <div class="hm-Login_PasswordWrapper "> 
     <input type="text" class="hm-Login_InputField Hidden "> 
     <input type="password" class="hm-Login_InputField "> 
     <button tabindex="0" class="hm-Login_LoginBtn "> 
      IR 
     </button> 
     <div class="hm-Login_InputText "> 
      Recordar contraseña 
     </div> 
    </div> 
</div> 

如果您從上到下收集所有這些文件,它們是用戶名,您試圖將密碼放入的字段和密碼字段。

現在,如果您嘗試直接將密鑰發送到密碼字段input[2],您將收到錯誤,表明該元素不可見。您必須先點擊input[1]才能看到input[2]

你可以很容易地用xpaths來做,但我發現下面的方法更清晰。

login = WebDriverWait(browser, 10).until(
     EC.presence_of_element_located((By.CLASS_NAME, 'hm-Login'))) 

fields = login.find_elements_by_css_selector('.hm-Login_InputField') 
button = login.find_element_by_css_selector('.hm-Login_LoginBtn') 

fields[0].send_keys('user_name') 
fields[1].click() 
fields[2].send_keys('password') 
button.click() 
+0

處結束,這完全回答並解決了我的問題。我打勾你的答案是正確的。順便說一句,爲什麼你認爲使用css選擇器而不是xpath更清潔? – puppet

+0

@puppet [所有找到元素的方法都有其用途](https://stackoverflow.com/questions/36620562/is-using-absolute-xpath-to-locate-elements-a-good-practice-if-no -is-there-any),但在這種情況下,通過類名或css選擇器查​​找某個內容會更緊湊,因爲可以通過一次搜索來獲取所有字段。另外,如果有人想檢查xpath的正確性,他們必須手動橫向樹,這在這種情況下是乏味的。但是,來自'login'對象的相對xpath完全不錯。 – Reti43

+0

@puppet [This](https://stackoverflow.com/questions/34521441/locating-an-element-by-id)也是一個有趣的閱讀。 – Reti43

相關問題