硒罐';t通过it访问web元素';s id(python)

硒罐';t通过it访问web元素';s id(python),python,selenium,Python,Selenium,我已经编写了一个简单的selenium脚本来登录我们的系统,但是selenium webdriver找不到脚本中提到的任何元素。元素的id为“用户名”和“密码”。有一件奇怪的事情-这个脚本有时工作正常,没有任何错误,有时我也会出现相同的错误(脚本没有更改)。我正在windows 7上运行此脚本。此脚本是用python 3.4编写的(可能这很重要) 代码如下: import unittest from selenium import webdriver from selenium.webdrive

我已经编写了一个简单的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)
======================================================================
错误:测试日志到系统(\uuuuu main\uuuuuuu.SodexoLogin)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“C:\AT\test1.py”,第13行,在测试日志系统中
用户名=驱动程序。通过\u id(“用户名”)查找\u元素\u
文件“C:\Python34\lib\site packages\selenium\webdriver\remote\webdriver.py”,第234行,按id查找元素
返回self.find_元素(by=by.ID,value=ID_u)
文件“C:\Python34\lib\site packages\selenium\webdriver\remote\webdriver.py”,第712行,位于find\u元素中
{'using':by'value':value})['value']
文件“C:\Python34\lib\site packages\selenium\webdriver\remote\webdriver.py”,第201行,执行
self.error\u handler.check\u响应(响应)
文件“C:\Python34\lib\site packages\selenium\webdriver\remote\errorhandler.py”,第181行,在check\u响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.NoSuchElementException:消息:无法定位元素:{“方法”:“id”,“选择器”:“用户名”}
堆栈跟踪:
在FirefoxDriver.prototype.findelement内部(file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/driver component.js:10659)
在FirefoxDriver.prototype.findElement(file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/driver component.js:10668)
在DelayedCommand.prototype.executeInternal\uh处(file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/command processor.js:12534)
在DelayedCommand.prototype.executeInternal\u(file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/command processor.js:12539)
在DelayedCommand.prototype.execute/<(file:///C:/TEMP/tmp_p25io7i/extensions/fxdriver@googlecode.com/components/command processor.js:12481)
----------------------------------------------------------------------
在9.957秒内运行了1次测试
失败(错误=1)

似乎该网站尚未完全加载

也许你可以添加隐式等待


只需在
driver=self.driver
之后添加
driver.implicitly\u wait(10)
,您可能需要显式地等待元素本身:

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")
在我个人看来,这是一种更好的隐式等待方法,因为隐式等待会使您的整个时间变慢,而特定的等待某些元素只会增加在此特定点运行的脚本的时间。

这应该可以解决此问题

driver.implicitly_wait(10)

我已经添加了您的代码-并且我收到了下一个错误-
回溯(最近一次调用):文件“C:/AT/test2.py”,第13行,在test\u log\u to\u system driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS)AttributeError:“WebDriver”对象没有属性“manage”
抱歉,我在第一条评论中使用了java代码。更新的版本应该是可编译的。你能发布html吗?至少您要查找的部分。@drkthng这里是其中的一个元素-
谢谢这种方法更有趣、更有用,但当我运行此方法时,我收到以下错误消息:错误:test\u log\u to\u system(main.SodexoLogin)--------------------------------------------------------------------------------------回溯(最近的一次调用):文件“C:\AT\test2.py”,第13行,在测试日志\u to\u system wait=ui中。WebDriverWait(driver,10)name错误:名称“ui”不是defined@KirillAlexeyenko->查看我的更新答案->ui需要保留,但导入行需要插入代码顶部。试试这个,告诉我它是如何运作的是的,sry,没有提到导入,现在一切都好了)Kit已经说过要这么做了。