【问题标题】:Send_keys() doesn´t send the full stringSend_keys() 不发送完整的字符串
【发布时间】:2018-03-28 12:58:38
【问题描述】:

我正在尝试使用 Python 中的 selenium 和 Chrome 登录网站。我能够找到用户和密码字段以及按钮。我唯一不能做的就是用所有字符串填充密码字段。它写入一个长度不同的子字符串。

我的代码

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 上使用 send_keys() 的那一行没有写入密码的完整长度,我不知道为什么。 顺便说一句,我如何取回我刚刚使用 sed_keys() 发送的文本,以便了解正在传递的内容以及字符串中缺少的内容?

【问题讨论】:

  • 你打算怎么做?请记住,在发送第一个字符后,x_path 会发生变化,以便它以 input[2] 而不是 input[1] 结束

标签: python selenium selenium-webdriver selenium-chromedriver sendkeys


【解决方案1】:

您不应该在您选择的字段中输入密码。正如您在 cmets 中所指出的,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] 可见。

您可以使用 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()

【讨论】:

  • 这完全回答并解决了我的问题。我把你的答案选对了。顺便说一句,为什么你考虑使用 css 选择器而不是 xpath 来更简洁?
  • @puppet All methods to find an element have their uses,但在这种情况下,通过类名或 css 选择器查找内容更紧凑,因为您可以通过一次搜索获得所有字段。此外,如果有人想检查 xpath 的正确性,他们必须手动遍历树,在这种情况下这很乏味。但是,login 对象的相对 xpath 一点也不差。
  • @puppet This 也是一本有趣的书。
【解决方案2】:

我有同样的问题,我先点击元素然后发送文本,它解决了问题。

    el_search_wo.driver = driver.find_element_by_xpath("//*[@id='arid_WIN_0_302258625']")
    el_search_wo.click()
    el_search_wo.send_keys('TEXT HERE')

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2018-09-06
    • 2015-01-22
    • 1970-01-01
    • 2020-05-16
    • 2014-01-23
    • 2020-06-05
    • 2014-09-24
    相关资源
    最近更新 更多