2013-12-16 3 views
2

Откройте главную (домашнюю) страницу, а затем перейдите на страницу входа, используя функцию 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' должен быть добавлен в драйвер сразу после инициализации. И 'time.sleep' следует добавить после утверждения' print check'. – Jon

ответ

4

Вам лучше попытаться извлечь уникальные элементы, такие как поле имени пользователя и пароль, по его идентификатору. 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. 

Есть два способа ожидания времени а водитель может сделать:

  • Wait явно: водитель ждет на этот раз перед выполнением каждого следующего шага.
  • Подождите неявно: Если вы ищете элемент, который ищет драйвер, на этот раз, прежде чем он сделает исключение.

Для получения более подробной информации обратитесь к документации: 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'Unable, чтобы найти элемент: {"method": "name", "selector": "username"} ' –

+0

@GauravJain, It's strage. Я сам тестировал код, и он работал. Попробуйте 'driver.find_element_by_id (« id_username »)', как рекомендует Jon. – falsetru

0

Попробуйте

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

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

AttributeError: объект 'module' не имеет атрибута 'elementToBeVisible' –

+0

Мой плохой только что обновил мой ответ. Кстати, это java u нужно изменить на эквивалент python. –

+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

Почему вы «нажимаете» элемент 'username'? – Jon

+0

@Jon Если мы не добавим этот клик(), то драйвер не будет знать, куда отправить ключи (пусть будет поле со списком для имени пользователя) ... поэтому, если мы нажмем на него, курсор начнет мигать в поле со списком, мы можем передать значение ... просто попробуйте выше и дайте мне знать результат. –

Смежные вопросы