2013-12-16 67 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(),那么驱动程序将不知道在哪里发送密钥(假设组合框为用户名)...所以如果我们点击它,那么光标在组合框中闪烁我们可以通过价值...只是尝试以上,让我知道结果..谢谢 –

相关问题