0

PythonでSeleniumとChromeを使用してWebサイトにログインしようとしています。私は、ユーザーとパスワードフィールド、およびボタンを見つけることができます。私ができない唯一のことは、すべての文字列でパスワードフィールドを埋めることです。さまざまな長さの部分文字列を書き込みます。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は入力[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[2]を表示させるには、まずinput[1]をクリックする必要があります。

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

のinput [2]で終わるように変更されていますので、完全に答えて問題を解決してください。私はあなたの答えを正しいものとしてチェックしました。ちなみに、xpathではなくcssセレクタを使ってクリーナーを使うのはなぜですか? – puppet

+0

@puppet [要素を見つけるすべてのメソッドには用途があります。](https://stackoverflow.com/questions/36620562/is-using-absolute-xpath-to-locate-elements-a-good-practice-if-no -is-there-any)ですが、この場合はクラス名またはcssセレクタで何かを見つけるのがコンパクトです。なぜなら、1回の検索ですべてのフィールドを取得できるからです。また、誰かがxpathの正しさをチェックしたければ、手動でツリーを横断する必要があります。この場合は面倒です。しかし、 'login'オブジェクトからの相対的なxpathは全く悪くありません。 – Reti43

+0

@puppet [This](https://stackoverflow.com/questions/34521441/locating-an-element-by-id)も興味深い読み物です。 – Reti43

関連する問題