1

だから私は Web 自動化に Selenium を使用する方法を学んでいます - コンソールに American Express の残高を返すスクリプトを書こうとしています。最初のステップは、実際に正常にログオンすることです...

ログイン ボタンをクリックすると、要素が見つからないというエラーが発生するようです。

これは私のコードです:

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/fxdriver@googlecode.com/components/driver-component.js:10271)
    at FirefoxDriver.prototype.findElement (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/fxdriver@googlecode.com/components/driver-component.js:10280)
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/fxdriver@googlecode.com/components/command-processor.js:12274)
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/fxdriver@googlecode.com/components/command-processor.js:12279)
    at DelayedCommand.prototype.execute/< (file:///var/folders/mx/dbnsd72j05zd4k2cls4cvmf00000gn/T/tmpKQDaey/extensions/fxdriver@googlecode.com/components/command-processor.js:12221)

何かご意見は?アドバイス/ヘルプは大歓迎です、ありがとう!

4

1 に答える 1

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()
于 2015-03-09T02:38:40.003 に答える