我试图登录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
标记都有onfocus
和onchange
个属性。我没有为后者烦恼(我的目标是先将键盘输入文本框)。 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等任何其他语言。官方文档很好,但我无法使用它来解决这个问题。所以我想要一个更适合初学者的教程。
答案 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')
如果您对此有任何疑问,我可以尝试提供帮助。