我写了一个简单的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">
答案 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)