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