[英]I'm getting a "NoMethodError" when I already have defined the method
編寫我的 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
- 獲取 PageObject::Elements::Element您需要手動定義方法或為內容可編輯元素創建小部件。
手動定義 Setter
Contenteditable 元素可以使用#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"
定義小部件
如果您必須處理多個 contenteditable 元素,您應該創建一個小部件以消除手動創建每個 setter 的需要。
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 然后 msg.send_keys('blah')
或者,因為它是一個文本框,您可以直接使用它進行操作,具體取決於您的頁面的編碼方式 - 所以 msg.send_keys('blah') 可以直接工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.