Selenium发送密钥发送速度太快

时间:2017-09-13 21:54:15

标签: python selenium

我正在测试具有标准用户名条目和隐藏密码输入的网站上的登录信息。我选择用户名并发送字符串。我无法选择密码框,因为selenium.common.exceptions.ElementNotVisibleException: Message: element not visible所以我这样做:

login = driver.find_element_by_xpath('/html/body/div/div/div/div/div/div/div/div/input[1]')
login.send_keys(foo)
login.send_keys(Keys.TAB + bar + Keys.ENTER)

这从不起作用,密码长度为10个字符,它永远无法在密码框中获得全部10个密码。

我原以为我可以在发送密钥之间sleep(1),但由于隐藏字段的性质是不可能的。

如何通过直接选择密码字段或允许完整发送字符串来解决此问题?

修改

该网站是this网站的体育博彩部分。对于那些因管辖权原因无法查看的人,我会在回家时提供HTML样本。

4 个答案:

答案 0 :(得分:0)

您需要等待元素可见:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def wait_for_element_visible_by_css_selector(self, css, timeout=20):
    '''
    Wait for an element to be visible.
    This is used for example for a drop-down selector to wait for the list to show up
    :param css: the CSS pattern of the element to watch
    :param timeout: time to wait for it.
    '''
    WebDriverWait(self.driver, timeout).until(
      EC.visibility_of(self.driver.find_element_by_css_selector(css))
    )

我将此函数用作帮助程序作为testCase的一部分。因此,您需要进行调整,以便从您的self提供正确的wait_for_element_visible_by_css_selector('input')

然后只需将项目的css选择器传递给它。

EC.presence_of_element_located((By.CSS_SELECTOR, css))
EC.element_to_be_clickable((By.CSS_SELECTOR, css))

如果您愿意,显然可以使用xpath进行调整。

您还可以使用其他类型的等待:

{{1}}

答案 1 :(得分:0)

我认为很多问题是你如何尝试使用TAB将密钥发送到密码字段。没有必要依靠Tab键到正确的元素,只需抓住你想要的那个。此外,使用超过4-5级深度的XPath来查找元素(尤其是从HTML标记开始的元素)并不是一个好习惯。它很容易在页面中发生变化并且会中断。我会做类似下面的事情。

driver.find_element_by_css_selector("div.hm-Login_UserNameWrapper > input.hm-Login_InputField").send_keys(username)
driver.find_element_by_css_selector("div.hm-Login_PasswordWrapper > input.hm-Login_InputField")).send_keys(username)

有一个输入字段标记为type = password

<input type="password" class="hm-Login_InputField Hidden ">

但它是隐藏的,因此不是用户输入的那个。我在上面指定的选择器经过测试和工作。

答案 2 :(得分:-1)

试试这个:

login.send_keys(Keys.ARROW_RIGHT)
login.send_keys(<password>)
submit.click()

答案 3 :(得分:-1)

我喜欢在与时间有点不同的页面上做一些事情。首先确保我等待页面加载,然后发送密钥,然后睡眠,然后单击。

driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
x.send_keys(something)
Thread.sleep(500)
submit.click