2015-03-09 4 views
1

Итак, я изучаю, как использовать Selenium для автоматизации веб-сайтов. Я пытаюсь написать сценарий, который возвращает мой баланс American Express на мою консоль. Первый шаг на самом деле успешно регистрируется ...Не удается правильно получить доступ к элементу с помощью Python Selenium WebDriver

Похоже, что мое действие для нажатия кнопки входа вызывает ошибку, не обнаруживая элемент, хотя я вижу его, когда я нахожусь на firebug.

Это мой код:

from selenium import webdriver 

driver = webdriver.Firefox() 

baseurl = "https://www.americanexpress.com/canada/" 
username = "myusername" 
password = "mypassword" 

xpaths = { 'usernameField' : "//input[@id='UserID']", 
      'passwordField' : "//input[@id='Password']", 
      'submitButton' : "//input[@id='loginButton']" 
     } 

driver.get(baseurl) 

driver.find_element_by_xpath(xpaths['usernameField']).clear() 

driver.find_element_by_xpath(xpaths['usernameField']).send_keys(username) 

driver.find_element_by_xpath(xpaths['passwordField']).clear() 

driver.find_element_by_xpath(xpaths['passwordField']).send_keys(password) 

driver.find_element_by_xpath(xpaths['submitButton']).click() 

Это сообщение консоли ошибка я получаю, где браузер заполнил мои регистрационные данные, но только не нажал на кнопку входа:

Traceback (most recent call last): 
    File "get_balance.py", line 29, in <module> 
    driver.find_element_by_xpath(xpaths['submitButton']).click() 
    File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 232, in find_element_by_xpath 
    return self.find_element(by=By.XPATH, value=xpath) 
    File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 664, in find_element 
    {'using': by, 'value': value})['value'] 
    File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 175, in execute 
    self.error_handler.check_response(response) 
    File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 166, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//input[@id='loginButton']"} 
Stacktrace: 
    at FirefoxDriver.prototype.findElementInternal_ (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/[email protected]/components/driver-component.js:10271) 
    at FirefoxDriver.prototype.findElement (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/[email protected]/components/driver-component.js:10280) 
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/[email protected]/components/command-processor.js:12274) 
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/[email protected]/components/command-processor.js:12279) 
    at DelayedCommand.prototype.execute/< (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/[email protected]/components/command-processor.js:12221) 

Любые мысли? Любые советы/помощь очень ценятся, спасибо!

+0

вы можете предоставить ссылку на веб-страницу или выписку из веб-страницы – Calum

+0

это может быть, что кнопка создается с помощью JavaScript. если это так, вам может потребоваться дождаться его загрузки. – Calum

ответ

2

Это a элемент, а не input:

<a tabindex="0" href="#" id="loginButton" title="Login securely"> 
    <span></span> 
    Log In 
</a> 

Изменение в XPath: //a[@id="loginButton"].


Помимо этого, для id атрибутов есть find_element_by_id() метод:

driver.find_element_by_id("loginButton").click() 

Кроме того, если вы хотите, чтобы элемент локаторы отделен от фактического «действия» кода, вы можете сконфигурируйте его следующим образом (оставив одно выражение xpath для примера):

from selenium.webdriver.common.by import By 

locators = { 
    'usernameField': (By.ID, "UserID"), 
    'passwordField': (By.XPATH, "//input[@id='Password']"), 
    'submitButton': (By.ID, "loginButton") 
} 

Тогда ваше «действие» код будет использовать find_element():

username = driver.find_element(*locators['usernameField']) 
username.clear() 
username.send_keys(username) 

password = driver.find_element(*locators['passwordField']) 
password.clear() 
password.send_keys(password) 

login_button = driver.find_element(*locators['submitButton']) 
login_button.click() 
+0

Спасибо за вашу помощь alecxe, это сработало. И хороший совет с find_element_by_id, это, вероятно, проще, чем определение xpaths в этом случае. – ploo

+1

@ploo рад помочь, я также собираюсь обновить ответ, предлагая настроить локаторы по-другому - думаю, вам понравится. – alecxe

+0

@ploo см. Обновление. – alecxe