2013-12-16 65 views
2

打開main(home)頁面,然後使用click()函數轉到登錄頁面,現在我想要查找此頁面中的元素,我該怎麼辦?Selenium webdriver找到下一個鏈接中的元素

這裏是我的代碼...

import unittest,time,re 
from selenium import webdriver 
from selenium import selenium 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support import expected_conditions as EC 

class PythonOrgSearch(unittest.TestCase): 

    def setUp(self): 
     #self.selenium = selenium("localhost", 4444, "*firefox","http://www.google.com/") 
     self.driver = webdriver.Firefox() 

    def test_search_in_python_org(self): 
     driver = self.driver 
     driver.get("https://bitbucket.org/") 
     elem = driver.find_element_by_id("user-options") 
     elem = elem.find_element_by_class_name("login-link") 
     elem.click() 
     print "check" 

     #elem = WebDriverWait(driver, 30).until(EC.elementToBeVisible(By.name("username"))); 
     #elem.send_keys("[email protected]") 

     user_name_field = driver.find_element_by_id('id_username') 
     password_field = driver.find_element_by_id('id_password') 

     user_name_field.send_keys('your_user_name') 
     password_field.send_keys('your_password') 

    def tearDown(self): 
     pass 
     #self.driver.close() 

if __name__ == "__main__": 
    unittest.main() 

我得到這個錯誤(文件名python_org_search.py​​)

E 
====================================================================== 
ERROR: test_search_in_python_org (__main__.PythonOrgSearch) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "python_org_search.py", line 25, in test_search_in_python_org 
    user_name_field = driver.find_element_by_id('id_username') 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 197, in find_element_by_id 
    return self.find_element(by=By.ID, value=id_) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 681, in find_element 
    {'using': by, 'value': value})['value'] 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 164, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 164, in check_response 
    raise exception_class(message, screen, stacktrace) 
NoSuchElementException: Message: u'Unable to locate element: {"method":"id","selector":"id_username"}' ; Stacktrace: 
    at FirefoxDriver.prototype.findElementInternal_ (file:///tmp/tmpKo1TXx/extensions/[email protected]/components/driver_component.js:8860) 
    at FirefoxDriver.prototype.findElement (file:///tmp/tmpKo1TXx/extensions/[email protected]/components/driver_component.js:8869) 
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpKo1TXx/extensions/[email protected]/components/command_processor.js:10831) 
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpKo1TXx/extensions/[email protected]/components/command_processor.js:10836) 
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpKo1TXx/extensions/[email protected]/components/command_processor.js:10778) 

---------------------------------------------------------------------- 
Ran 1 test in 30.994s 

FAILED (errors=1) 

我嘗試過其他解決方案,以及但是還是同樣的錯誤。

+0

我在我的機器上直接嘗試了你的代碼 - 它工作的很完美。 如果它仍然失敗 - 給瀏覽器一些時間喘息: 將'implicitly_wait'添加到驅動程序和'time.sleep'如下所述。 – Jon

+0

初始化後,應該直接將'implicitly_wait'添加到驅動程序中。在'print check'語句之後應該添加'time.sleep'。 – Jon

回答

4

你最好應該嘗試通過它的id檢索像username字段和密碼字段這樣的獨特元素。 name可能不是唯一且具有誤導性。

請嘗試以下方法find_element_by_id('id_username')find_element_by_id('id_password')

有時你需要等待一段時間,你的瀏覽器呈現 的頁面和檢索的所有內容 - 因此它可能是有用的等待一段時間, 例如在你深入探索元素之前三秒鐘。

代碼

import time 

time.sleep(3) 
user_name_field = driver.find_element_by_id('id_username') 
password_field = driver.find_element_by_id('id_password') 

user_name_field.send_keys('your_user_name') 
password_field.send_keys('your_password') 

password_field.send_keys(Keys.RETURN) 
... 

此外,我建議你爲不同領域使用不​​同的變量的名稱。變量elem可能導致難以解決的錯誤。

三的等待時間上面提到的可能是不可靠像秒 - 確保一些等待時間更加結構化的方式是告訴它你的driver通過implicitly_wait

driver = webdriver.Firefox() 
driver.implicitly_wait(30) # maximally wait 30 seconds before raising an exception. 

# ... 
# go to the page etc. 

中有等待時間的兩種方法司機可以這樣做:

  • 等待明確:驅動程序執行的每一個步驟之前等待這段時間。
  • 含蓄地等待:如果您查找某個元素,驅動程序會在引發異常之前搜索這個元素。

欲瞭解更多詳細信息,請參閱文檔:http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits

+0

多數民衆贊成在..但仍然不工作? –

+0

那麼你會得到什麼類型的錯誤? – Jon

+0

當你在那裏添加'time.sleep()'和'implicitly_waint()'時它的行爲如何? – Jon

1

前一頁,它不存在的下面的代碼使用elem

elem = elem.find_element_by_name("username") 

相反,你應該使用driver

elem = driver.find_element_by_name("username") 
+0

仍然無法正常工作。 NoSuchElementException:消息:u'無法定位元素:{「method」:「name」,「selector」:「username」}' –

+0

@GauravJain,它很平坦。我自己測試了代碼,它工作。按Jon的說法試試'driver.find_element_by_id(「id_username」)'。 – falsetru

0

嘗試

elem = new WebDriverWait(Driver, 30).until(ExpectedConditions.visibilityOfElementLocated(By.name("username"))); 

elem.send_keys("[email protected]"); 
+0

AttributeError:'模塊'對象沒有屬性'elementToBeVisible' –

+0

我的不好只是更新了我的答案。順便說一句,這是Java你需要改變爲蟒蛇等值。 –

+0

這個問題被標記爲「python」,而不是「java」。 – falsetru

-1

要填充任何類型的表單......最好的方法是要經過它的名字在任何情況下永遠可用。

driver=self.webdriver 
    driver.find_element_by_name("username").click() 
    driver.find_element_by_name("username").send_keys("XXXXX") 
    time.sleep(5) 
    driver.find_element_by_name("password").click() 
    driver.find_element_by_name("password").send_keys("XXXXX") 
+0

爲什麼你點擊'用戶名'項? – Jon

+0

@Jon如果我們不添加那個click(),那麼驅動程序將不知道在哪裏發送密鑰(假設組合框爲用戶名)...所以如果我們點擊它,那麼光標在組合框中閃爍我們可以通過價值...只是嘗試以上,讓我知道結果..謝謝 –

相關問題