python - Selenium 无法通过 id 访问网络元素(python)

标签 python selenium

我编写了一个简单的 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/

相关文章:

Python pandas 时间序列,具有分层索引和滚动/移位

python - 将文件头解析为 Python/pandas 中的日期对象

python - 制作随机电话号码 xxx-xxx-xxxx

javascript - 模拟连接错误

javascript - 如何从 Protractor 中的随机菜单中获取元素?

python - 在 Python 中,如何使 for 循环以任意增量进行计数?

python - 在 Python 中反转字符串

java - 比较两个值时,它显示字符串索引超出范围 : -1

Python Selenium : Element currently not visible

java - TestNG 中的非静态 Webdriver 驱动程序和屏幕截图监听器