0

셀렌과 Chrome이있는 Python 웹 사이트에 로그인하려고합니다. 나는 사용자와 패스워드 필드와 버튼을 찾을 수있다. 내가 할 수없는 유일한 방법은 모든 문자열로 암호 필드를 채우는 것입니다. 다양한 길이의 하위 문자열을 씁니다.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]을 클릭해야합니다.

xpath를 사용하면 쉽게 할 수 있지만 다음과 같은 방법을 사용하면 더욱 편리합니다.

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

의 입력이 끝난 입력 [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 선택기로 무언가를 찾는 것이 더 간단합니다. 하나의 검색으로 모든 필드를 얻을 수 있기 때문입니다. 또한, 누군가가 xpath의 정확성을 확인하기를 원한다면, 나무를 수동으로 횡단해야 할 것입니다.이 경우에는 지루합니다. 그러나,'login' 객체로부터의 상대적 xpath는 전혀 나쁘지 않습니다. – Reti43

+0

@puppet [This] (https://stackoverflow.com/questions/34521441/locating-an-element-by-id)도 흥미로운 읽을 거리입니다. – Reti43

관련 문제