Selenium无法通过id(python)访问web元素

时间:2015-12-09 10:00:03

标签: python selenium

我写了一个简单的selenium脚本来登录我们的系统,但selenium webdriver找不到脚本中提到的任何元素.Elemnts的id为“username”和“password”。有一个奇怪的事情 - 这个脚本有时候没有任何错误,有时我会得到同样的错误(虽然脚本没有改变)。我在Windows 7脚本上运行这个脚本是用python 3.4编写的(也许这很重要) 这是代码:

<table>
  <thead>
    <tr>
      <th>Position</th>
      <th>Team</th>
      <th>Points</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>2</td>
      <td>Chelsea</td>
      <td>23</td>
    </tr>
  </tbody>
</table>

元素的HTML代码如下所示:

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()

以下是我收到的错误消息:

<input type="password" class="form-control ng-untouched ng-valid ng-dirty ng-valid-parse" id="password" ng-model="password" placeholder="Password">

3 个答案:

答案 0 :(得分:1)

似乎是网站没有满载。

也许你可以添加隐含的等待。

只需在driver.implicitly_wait(10)

之后添加driver = self.driver即可

答案 1 :(得分: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")

在我个人看来,这是一种更好的隐式等待方法,因为后者会使整个时间减慢,而特定等待某些元素只会增加在此特定点运行的脚本的时间。

答案 2 :(得分:-1)

这应该解决它

driver.implicitly_wait(10)