簡體   English   中英

當我已經定義了方法時,我收到了“NoMethodError”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM