当我已经定义了方法时,我得到了一个"NoMethodError"



编写我的Ruby-Watir-cucumber bdd测试,我得到这个:

NoMethodError: undefined method `msg=' for #<Watir::Browser:0x0000558fbcdc0cc0>
./features/support/pages/message_page.rb:27:in `escribir'
./features/step_definitions/message_steps.rb:14:in `/^I'm able to write and send a "([^"]*)" successfully$/'
./features/send_messages.feature:12:in `Then I'm able to write and send a "Robot message" successfully'
./features/send_messages.feature:9:in `Then I'm able to write and send a "<message>" successfully'
1 scenario (1 failed)
4 steps (1 failed, 3 passed)
0m12.939s
Process finished with exit code 1

当我已经定义了方法时:

class MessagePage
include PageObject
@@browser = Watir::Browser.new
page_url 'https://www.linkedin.com/messaging/'
text_field(:searchcontact, name: 'searchTerm')
div(:txtmessage,:role => "textbox")
button(:btnsend,:type => 'submit')
div(:txtfield,:xpath =>"//div//div[@role='textbox']")
text_field(:mensaje,:xpath =>"//div//div[@role='textbox']")
div(:msg,:role => "textbox") /// HERE!!!
def searchcontact contact
self.searchcontact = contact
#searchcontact(contact).send_keys(:enter)
wait 5
end
def buscar contact
wait_until do
searchcontact_element.visible?
self.searchcontact = contact
end
self.searchcontact = contact
end
def escribir (message)
self.msg = message
wait 5
end
def writemessage message
wait_until do
msg_element.visible?
self.msg = message
end
self.msg = message
end
def sendmessage
btnsend
end

end

访问器div(:msg,:role => "textbox")不生成#msg=方法。它仅定义:

  • #msg- 获取div 的文本
  • #msg?- 检查div 是否存在
  • #msg_element- 获取页面对象
  • ::元素::元素

您需要手动定义方法或为内容可编辑元素创建小部件。

手动定义资源库

可以使用#set方法输入可内容编辑的元素。您可以使用它来创建 setter 方法:

class MessagePage
include PageObject
div(:msg, role: "textbox")
def msg=(value)
msg_element.set(value)
end
end
page = MessagePage.new(browser)
page.msg = 'your text'
p page.msg
#=> "your text"

定义小部件

如果您必须处理多个内容可编辑的元素,则应创建一个小部件,以消除手动创建每个资源库的需要。

class Contentedtiable < PageObject::Elements::Element
def self.accessor_methods(widget, name)
#
# Set text
#
widget.send('define_method', "#{name}=") do |value|
self.send("#{name}_element").set(value)
end
#
# Get text
#
widget.send('define_method', "#{name}") do
self.send("#{name}_element").text
end
end
PageObject.register_widget :contenteditable, self, :element
end
class MyPage
include PageObject
contenteditable(:msg, tag_name: 'div', role: 'textbox')
end
page = MyPage.new(browser)
page.msg = 'your text'
p page.msg
#=> "your text"

单击文本框后,您可以向其发送密钥。所以像

msg.Click then msg.send_keys('blah'(

或者,也许因为它是一个文本框,您可以直接使用它,具体取决于页面的编码方式 - 所以msg.send_keys('blah'(可以直接工作。

最新更新