Selenium webdriver 查找下一个链接中的元素

使用 Selenium webdriver 打开主(主页)页面,然后使用 click() 函数转到登录页面,现在我想在该页面中查找元素,该怎么做?

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("my_username@bitbucket.org")

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

上述代码运行后,会报错:

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/fxdriver@googlecode.com/components/driver_component.js:8860)
    at FirefoxDriver.prototype.findElement (file:///tmp/tmpKo1TXx/extensions/fxdriver@googlecode.com/components/driver_component.js:8869)
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpKo1TXx/extensions/fxdriver@googlecode.com/components/command_processor.js:10831)
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpKo1TXx/extensions/fxdriver@googlecode.com/components/command_processor.js:10836)
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpKo1TXx/extensions/fxdriver@googlecode.com/components/command_processor.js:10778) 

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

FAILED (errors=1)

2. 解决方案

解决方案 1:

  1. 使用 id 而不是 name 来查找唯一元素,例如 user_name_field = driver.find_element_by_id('id_username')password_field = driver.find_element_by_id('id_password')
  2. 有时需要等待浏览器渲染页面并检索所有内容,因此在进一步查找元素之前等待一段时间(例如 3 秒)可能会有所帮助。
  3. 使用不同的变量名来表示不同的字段,以免混淆。
  4. 使用隐式等待可以保证在查找元素时,driver 在抛出异常之前会等待一定时间。
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)
...

或者:

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

# ...
# go to the page etc.

解决方案 2:

不应该再使用前一个页面的元素,因为它们已经不存在了,应该直接使用 driver 来寻找元素。

elem = driver.find_element_by_name("username")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值