如何将键击发送到一个保持隐藏的文本框,直到它被点击为止?

时间:2017-10-14 16:17:26

标签: javascript python selenium selenium-webdriver web-scraping

我试图登录this site。但我甚至无法使用用户名填充文本框。

我试过了:

  • 隐式和显式等待

  • 执行JavaScript

文本框的结构

用户名包含在td标记内,可以使用其width属性进行定位。文本框本身由两个input标记表示。第一个是隐藏的。两者都有style个属性。第一个的初始值为display: none;,当我点击文本框时会更改为display: inline-block;。并且第二个输入标记的style属性设置为display: none;。同样,一旦用户名文本框失去焦点,这两个都会切换。

等待

我尝试使用隐式和显式等待。实现显式等待的代码导致TimeoutException错误:

wait = WebDriverWait(driver, 10)
elem_username = wait.until(EC.visibility_of_element_located((By.ID, 'txt_username')))

执行JavaScript

input标记都有onfocusonchange个属性。我没有为后者烦恼(我的目标是先将键盘输入文本框)。 onfocus的值为SetEnd(this)。所以,我试图执行它。

我遇到的问题是我找不到任何可以帮助我执行JavaScript的文档。所以我在StackOverflow上看了几个相关的答案。我先试了一下:

elem_username = driver.find_element_by_id('txt_username')
driver.execute_script('SetEnd(this)')

当然,我知道它不起作用,因为我没有提到这个元素。所以在浏览了几个问题之后,我了解到execute_script接受了参数。所以我修改了代码,这引发了一个错误,说脚本没有像这样的函数:

driver.execute_script('arguments[0].SetEnd(this)', elem_username)

然后,我看到了一个使用' click()'在execute_script内;所以我也试过了:

driver.execute_script('arguments[0].click()', elem_username)

我想,点击()'仅适用于按钮。但是因为我不得不点击"在文本框中将它聚焦,我认为它会起作用。它没有。

这是我在所有尝试中执行的最后一行,毫无例外地,它一直引发ElementNotInteractableException错误:

elem_username.send_keys('blahblahblah')

要求

如果我有更多的经验,那么Q& As在这个网站上当然会非常好。例如,有几个答案显示明确的等待,但其中大多数旨在解决OP的问题,因此它们只包括代码的相关部分。我很难理解它们。

我想解决这个问题(登录网站),但我也想正确学习使用selenium 。我之前几乎没有使用Java等任何其他语言。官方文档很好,但我无法使用它来解决这个问题。所以我想要一个更适合初学者的教程。

2 个答案:

答案 0 :(得分:0)

这对我有用:

# Force the element to be displayed (noticed style.display = "none")
# Yes, I know you can see it, but selenium thinks it's not displayed.
driver.execute_script('document.getElementsByName("txt_username")[0].style.display="block"')

elem_username.send_keys('your name')

答案 1 :(得分:0)

所以你已经很好地概述了一切,你似乎对它有了很好的理解。诀窍是先点击第二个input,然后将密钥发送到第一个input,因为它会被聚焦。 (我确实发现点击包含td的内容也适用于Chrome,但浏览器在这方面有所不同,此页面的意图是您点击第二个输入)。一个简单的解决方案如下:

real, readonly = driver.find_elements_by_css_selector("input[onfocus*='SetEnd']")
readonly.click()
real.send_keys('hi')

如果您对此有任何疑问,我可以尝试提供帮助。