我编写了一个简单的 selenium 脚本来登录我们的系统,但是 selenium webdriver 找不到脚本中提到的任何元素。元素的 id 为“用户名”和“密码”。有一件奇怪的事情- 这个脚本有时可以正常工作,没有任何错误,有时我会遇到相同的错误(虽然脚本没有改变)。我在 Windows 7 上运行这个脚本,脚本是用 python 3.4 编写的(也许这很重要) 这是代码:
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class SodexoLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
def test_log_to_system(self):
driver = self.driver
driver.get("http://dev.itsoft.co.il:8080/dev/sodexo-backoffice-components")
username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")
username.send_keys("*********")
password.send_keys("*********")
username.send_keys(Keys.RETURN)
password.send_keys(Keys.RETURN)
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
元素的 HTML 代码如下所示:
<input type="password" class="form-control ng-untouched ng-valid ng-dirty ng-valid-parse" id="password" ng-model="password" placeholder="Password">
这是我收到的错误消息:
======================================================================
ERROR: test_log_to_system (__main__.SodexoLogin)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\AT\test1.py", line 13, in test_log_to_system
username = driver.find_element_by_id("username")
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 234, in find_element_by_id
return self.find_element(by=By.ID, value=id_)
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 712, in find_element
{'using': by, 'value': value})['value']
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 201, in execute
self.error_handler.check_response(response)
File "C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 181, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"id","selector":"username"}
Stacktrace:
at FirefoxDriver.prototype.findElementInternal_ (file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/driver-component.js:10659)
at FirefoxDriver.prototype.findElement (file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/driver-component.js:10668)
at DelayedCommand.prototype.executeInternal_/h (file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/command-processor.js:12534)
at DelayedCommand.prototype.executeInternal_ (file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/command-processor.js:12539)
at DelayedCommand.prototype.execute/< (file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/command-processor.js:12481)
----------------------------------------------------------------------
Ran 1 test in 9.957s
FAILED (errors=1)
最佳答案
您可能想显式等待元素本身:
import selenium.webdriver.support.ui as ui
...
def test_log_to_system(self):
driver = self.driver
driver.get("http://dev.itsoft.co.il:8080/dev/sodexo-backoffice-components")
wait = ui.WebDriverWait(driver,10)
wait.until(lambda driver: driver.find_element_by_id('username'))
username = driver.find_element_by_id("username")
wait.until(lambda driver: driver.find_element_by_id('password'))
password = driver.find_element_by_id("password")
在我个人看来,这是隐式等待的更好方法,因为后者会一直减慢您的速度,而特定等待某些元素只会增加在该特定点运行的脚本的时间。
关于python - Selenium 无法通过 id 访问网络元素(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175827/