为什么我的 selenium 停止识别有效 javascript?
Why has my selenium stopped recognizing valid javascript?
事实是我已经得到了答案,但显然关于此特定症状的唯一其他问题是 here and 。
对于其他任何人,我认为更明确地了解这一点可能会有所帮助:an upgrade to Firefox broke Selenium。
症状是:
Selenium::WebDriver::Error::JavascriptError: arguments[0] is undefined
[remote server] http://127.0.0.1:39449/users/login?id=1 line 68 > Function:1:in `anonymous'
[remote server] http://127.0.0.1:39449/users/login?id=1:68:in `handleEvaluateEvent'
只有我的 javascript 启用测试失败。
黄瓜驱动的相关位 Capybara/RSpec 是(失败行是对 fill_in
的调用:
def login(email, password)
link = login_path(email: email)
visit link
fill_in 'Password', with: password
click_button('Login')
end
我的堆栈跟踪是:
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/default.rb:66:in `request'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:640:in `raw_execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:618:in `execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:339:in `executeScript'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/common/driver.rb:193:in `execute_script'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/selenium/node.rb:46:in `set'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/element.rb:107:in `block in set'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/base.rb:84:in `synchronize'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/element.rb:103:in `set'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/actions.rb:56:in `fill_in'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/session.rb:676:in `block (2 levels) in <class:Session>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/within_steps.rb:12:in `login'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/within_steps.rb:21:in `login_as_admin'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/shared_steps.rb:13:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_step_definition.rb:97:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/step_match.rb:25:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:60:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:23:in `step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/formatter/model.rb:150:in `replay'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/formatter/model.rb:178:in `replay'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/listener/formatter_listener.rb:88:in `replay'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/listener/formatter_listener.rb:145:in `replay_step_or_examples'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/listener/formatter_listener.rb:60:in `step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/parser/parser.rb:50:in `block (2 levels) in <class:Parser>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/lexer/i18n_lexer.rb:24:in `scan'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/lexer/i18n_lexer.rb:24:in `scan'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/parser/parser.rb:33:in `parse'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:53:in `invoke_steps'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_world.rb:63:in `steps'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/shared_steps.rb:24:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_step_definition.rb:97:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/step_match.rb:25:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_invocation.rb:60:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_invocation.rb:38:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:106:in `block in visit_step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:105:in `visit_step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_collection.rb:19:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_collection.rb:18:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_collection.rb:18:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:100:in `block in visit_steps'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:99:in `visit_steps'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:15:in `block in execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:83:in `block (2 levels) in with_hooks'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:99:in `before_and_after'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:82:in `block in with_hooks'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:120:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:120:in `block (3 levels) in around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:9:in `block in around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `block (3 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/generic/base.rb:15:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/base.rb:92:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:86:in `block (2 levels) in cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `cleaning'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/support/database_cleaner.rb:11:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_hook.rb:14:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:114:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:93:in `block (2 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `block (3 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/generic/base.rb:15:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/base.rb:92:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:86:in `block (2 levels) in cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/cucumber.rb:2:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_hook.rb:14:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:114:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:93:in `block (2 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:97:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:97:in `execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:8:in `around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:119:in `block (2 levels) in around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:123:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:123:in `around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:94:in `around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:81:in `with_hooks'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:13:in `execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/scenario.rb:32:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/scenario.rb:79:in `with_visitor'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/scenario.rb:31:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:58:in `block in visit_feature_element'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:57:in `visit_feature_element'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/feature.rb:38:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/feature.rb:37:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/feature.rb:37:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:27:in `block in visit_feature'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:26:in `visit_feature'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:28:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:17:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:17:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:27:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:21:in `block in visit_features'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:20:in `visit_features'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:49:in `run!'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/cli/main.rb:47:in `execute!'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/bin/cucumber:13:in `<top (required)>'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/script/cucumber:9:in `load'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/script/cucumber:9:in `<top (required)>'
-e:1:in `load'
-e:1:in `<main>'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/edit_bracket_as_admin.feature:13:in `Given 'An admin' visiting the 'Edit Bracket' page'
降级到 34.0.5 是通往胜利的道路。
事实是我已经得到了答案,但显然关于此特定症状的唯一其他问题是 here and
对于其他任何人,我认为更明确地了解这一点可能会有所帮助:an upgrade to Firefox broke Selenium。
症状是:
Selenium::WebDriver::Error::JavascriptError: arguments[0] is undefined
[remote server] http://127.0.0.1:39449/users/login?id=1 line 68 > Function:1:in `anonymous'
[remote server] http://127.0.0.1:39449/users/login?id=1:68:in `handleEvaluateEvent'
只有我的 javascript 启用测试失败。
黄瓜驱动的相关位 Capybara/RSpec 是(失败行是对 fill_in
的调用:
def login(email, password)
link = login_path(email: email)
visit link
fill_in 'Password', with: password
click_button('Login')
end
我的堆栈跟踪是:
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/default.rb:66:in `request'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:640:in `raw_execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:618:in `execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:339:in `executeScript'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/common/driver.rb:193:in `execute_script'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/selenium/node.rb:46:in `set'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/element.rb:107:in `block in set'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/base.rb:84:in `synchronize'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/element.rb:103:in `set'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/node/actions.rb:56:in `fill_in'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/session.rb:676:in `block (2 levels) in <class:Session>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/capybara-2.4.4/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/within_steps.rb:12:in `login'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/within_steps.rb:21:in `login_as_admin'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/shared_steps.rb:13:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_step_definition.rb:97:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/step_match.rb:25:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:60:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:23:in `step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/formatter/model.rb:150:in `replay'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/formatter/model.rb:178:in `replay'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/listener/formatter_listener.rb:88:in `replay'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/listener/formatter_listener.rb:145:in `replay_step_or_examples'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/listener/formatter_listener.rb:60:in `step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/parser/parser.rb:50:in `block (2 levels) in <class:Parser>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/lexer/i18n_lexer.rb:24:in `scan'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/lexer/i18n_lexer.rb:24:in `scan'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/gherkin-2.12.2/lib/gherkin/parser/parser.rb:33:in `parse'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:53:in `invoke_steps'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_world.rb:63:in `steps'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/step_definitions/shared_steps.rb:24:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_step_definition.rb:97:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/step_match.rb:25:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_invocation.rb:60:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_invocation.rb:38:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:106:in `block in visit_step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:105:in `visit_step'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_collection.rb:19:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_collection.rb:18:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/step_collection.rb:18:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:100:in `block in visit_steps'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:99:in `visit_steps'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:15:in `block in execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:83:in `block (2 levels) in with_hooks'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:99:in `before_and_after'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:82:in `block in with_hooks'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:120:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:120:in `block (3 levels) in around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:9:in `block in around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `block (3 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/generic/base.rb:15:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/base.rb:92:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:86:in `block (2 levels) in cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `cleaning'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/support/database_cleaner.rb:11:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_hook.rb:14:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:114:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:93:in `block (2 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:94:in `block (3 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/generic/base.rb:15:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/base.rb:92:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:86:in `block (2 levels) in cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/configuration.rb:87:in `cleaning'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/database_cleaner-1.4.0/lib/database_cleaner/cucumber.rb:2:in `block in <top (required)>'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/rb_support/rb_hook.rb:14:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:114:in `invoke'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:93:in `block (2 levels) in execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:97:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:97:in `execute_around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/language_support/language_methods.rb:8:in `around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:119:in `block (2 levels) in around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:123:in `call'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime/support_code.rb:123:in `around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:94:in `around'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:81:in `with_hooks'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:13:in `execute'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/scenario.rb:32:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/scenario.rb:79:in `with_visitor'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/scenario.rb:31:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:58:in `block in visit_feature_element'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:57:in `visit_feature_element'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/feature.rb:38:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/feature.rb:37:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/feature.rb:37:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:27:in `block in visit_feature'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:26:in `visit_feature'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:28:in `block in accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:17:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:17:in `each'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/features.rb:27:in `accept'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:21:in `block in visit_features'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:170:in `broadcast'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/ast/tree_walker.rb:20:in `visit_features'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/runtime.rb:49:in `run!'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/lib/cucumber/cli/main.rb:47:in `execute!'
/home/rev-dr-d3/.rvm/gems/ruby-2.0.0-p594/gems/cucumber-1.3.18/bin/cucumber:13:in `<top (required)>'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/script/cucumber:9:in `load'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/script/cucumber:9:in `<top (required)>'
-e:1:in `load'
-e:1:in `<main>'
/media/rev-dr-d3/_external/development/ruby-madness/RubymineProjects/AliasMadness/features/edit_bracket_as_admin.feature:13:in `Given 'An admin' visiting the 'Edit Bracket' page'
降级到 34.0.5 是通往胜利的道路。