尝试学习将 PageObjects 与 Ruby 一起使用 - 出现错误 "uninitialized constant Site (NameError)"
Trying to learn to use PageObjects with Ruby - getting error "uninitialized constant Site (NameError)"
我在 Python 和 Ruby 中有一些使用 Selenium 的经验,并且可以编写成功执行的脚本,但他们没有使用 类,所以我想了解更多关于 类 并将脚本拆分为 pageobejcts。
我发现这个例子可以学习:http://watir.com/guides/page-objects/ 所以复制了脚本并做了一些小的修改,如下所示。
我在 Win10 上使用 SublimeText 3.x 和 Ruby 2.4.x,所以你知道我用的是什么工具。
我将整个脚本放入一个 .rb 文件中(唯一的区别是我替换了 URL 和输入用户名和密码的元素)并尝试执行它并获得以下内容错误:
C:/selenium/ruby/lotw/lotwlogin.rb:3:in `<main>': uninitialized constant Site (NameError).
我添加了顶行 (required 'watir'
) 行,它对遇到的错误没有影响。
所以我在 lotwlogin.rb 中基本掌握了带有自定义元素的原始脚本的结构和语法。但是核心结构报错,不知如何是好
这是我的脚本:
require 'watir'
site = Site.new(Watir::Browser.new :chrome) # was :firefox but that no longer works since FF63
login_page = site.login_page.open
user_page = login_page.login_as "testuser", "testpassword" # dummy user and password for now
user_page.should be_logged_in
class BrowserContainer
def initialize(browser)
@browser = browser
end
end
class Site < BrowserContainer
def login_page
@login_page = LoginPage.new(@browser)
end
def user_page
@user_page = UserPage.new(@browser)
end
def close
@browser.close
end
end
class LoginPage < BrowserContainer
URL = "https://lotw.arrl.org/lotw/login"
def open
@browser.goto URL
#@browser.window.maximize
self # no idea what this is for
end
def login_as(user, pass)
user_field.set user
password_field.set pass
login_button.click
next_page = UserPage.new(@browser)
Watir::Wait.until { next_page.loaded? }
next_page
end
private
def user_field
@browser.text_field(:name => "login")
end
def password_field
@browser.text_field(:name => "password")
end
def login_button
@browser.button(:value => "Log On")
end
end # LoginPage
class UserPage < BrowserContainer
def logged_in?
logged_in_element.exists?
end
def loaded?
@browser.h3 == "Welcome to Your Logbook of the World User Account Home Page"
end
private
def logged_in_element
@browser.div(:text => "Log off")
end
end # UserPage
如能提供任何避免出现站点错误的帮助,我们将不胜感激。
谢谢
麦克
您只在下面的几行中定义了 class Site
。但到那时,还不得而知。
将此逻辑移至所有 class 定义之后:
site = Site.new(Watir::Browser.new :chrome) # was :firefox but that no longer works since FF63
login_page = site.login_page.open
user_page = login_page.login_as "testuser", "testpassword" # dummy user and password for now
user_page.should be_logged_in
我在 Python 和 Ruby 中有一些使用 Selenium 的经验,并且可以编写成功执行的脚本,但他们没有使用 类,所以我想了解更多关于 类 并将脚本拆分为 pageobejcts。
我发现这个例子可以学习:http://watir.com/guides/page-objects/ 所以复制了脚本并做了一些小的修改,如下所示。
我在 Win10 上使用 SublimeText 3.x 和 Ruby 2.4.x,所以你知道我用的是什么工具。
我将整个脚本放入一个 .rb 文件中(唯一的区别是我替换了 URL 和输入用户名和密码的元素)并尝试执行它并获得以下内容错误:
C:/selenium/ruby/lotw/lotwlogin.rb:3:in `<main>': uninitialized constant Site (NameError).
我添加了顶行 (required 'watir'
) 行,它对遇到的错误没有影响。
所以我在 lotwlogin.rb 中基本掌握了带有自定义元素的原始脚本的结构和语法。但是核心结构报错,不知如何是好
这是我的脚本:
require 'watir'
site = Site.new(Watir::Browser.new :chrome) # was :firefox but that no longer works since FF63
login_page = site.login_page.open
user_page = login_page.login_as "testuser", "testpassword" # dummy user and password for now
user_page.should be_logged_in
class BrowserContainer
def initialize(browser)
@browser = browser
end
end
class Site < BrowserContainer
def login_page
@login_page = LoginPage.new(@browser)
end
def user_page
@user_page = UserPage.new(@browser)
end
def close
@browser.close
end
end
class LoginPage < BrowserContainer
URL = "https://lotw.arrl.org/lotw/login"
def open
@browser.goto URL
#@browser.window.maximize
self # no idea what this is for
end
def login_as(user, pass)
user_field.set user
password_field.set pass
login_button.click
next_page = UserPage.new(@browser)
Watir::Wait.until { next_page.loaded? }
next_page
end
private
def user_field
@browser.text_field(:name => "login")
end
def password_field
@browser.text_field(:name => "password")
end
def login_button
@browser.button(:value => "Log On")
end
end # LoginPage
class UserPage < BrowserContainer
def logged_in?
logged_in_element.exists?
end
def loaded?
@browser.h3 == "Welcome to Your Logbook of the World User Account Home Page"
end
private
def logged_in_element
@browser.div(:text => "Log off")
end
end # UserPage
如能提供任何避免出现站点错误的帮助,我们将不胜感激。
谢谢
麦克
您只在下面的几行中定义了 class Site
。但到那时,还不得而知。
将此逻辑移至所有 class 定义之后:
site = Site.new(Watir::Browser.new :chrome) # was :firefox but that no longer works since FF63
login_page = site.login_page.open
user_page = login_page.login_as "testuser", "testpassword" # dummy user and password for now
user_page.should be_logged_in