Selenium webdriver finding element in next link

2020-07-26 07:33发布

问题:

open main(home) page and then go to login page using click() function , now i want to find element in this page how could I?

here is my code ...

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

I got this error (file name 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/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)

I tried other solutions as well but still same error .

回答1:

You better should try to retrieve unique elements like the username field and password field by it's id. The name might not be unique and misleading.

Try the following find_element_by_id('id_username') and find_element_by_id('id_password').

Sometimes you need to wait some time that your browser renders the page and retrieves all contents - so it can be useful to wait some time, e.g. three seconds before you look deeper for elements.

Code

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

Moreover, I recommend you to use different variables names for the different fields. The variable elem could lead to difficult bugs.

Three seconds of waiting time like mentioned above can be unreliable - a more structured way of assuring some waiting time is it to tell it your driver through implicitly_wait:

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

# ...
# go to the page etc.

There are two ways of waiting time a driver can do:

  • Wait explicitly: The driver waits this time before executing every next step.
  • Wait implicitly: If you look for an element the driver searches for this time before he raises an exception.

For more details see the documentation: http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits



回答2:

The following code use elem of previous page, which does not exist.

elem = elem.find_element_by_name("username")

Instead, you should use driver:

elem = driver.find_element_by_name("username")


回答3:

Try

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

elem.send_keys("my_username@bitbucket.org");


回答4:

To fill any type of form...the best method is go through its name in any case where ever available.

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