【问题标题】:I'm getting a "NoMethodError" when I already have defined the method当我已经定义了方法时,我得到了一个“NoMethodError”
【发布时间】:2020-05-16 03:30:37
【问题描述】:

编写我的 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

【问题讨论】:

    标签: ruby cucumber bdd watir page-object-gem


    【解决方案1】:

    访问器div(:msg,:role =&gt; "textbox") 不会生成#msg= 方法。它只定义:

    • #msg - 获取 div 的文本
    • #msg? - 检查 div 是否存在
    • #msg_element - 获取 PageObject::Elements::Element

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

    手动定义设置器

    可以使用#set 方法输入Contenteditable 元素。您可以使用它来创建一个 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"
    

    【讨论】:

    • 但在编写脚本期间,我已经以同样的方式处理过可编辑元素!这就是让我感到困惑的原因
    • ``` class LoginPage include PageObject page_url "linkedin.com" a(:loginfield,:text => "Login") text_field(:txtusername,:name => 'session_key') text_field(: txtpassword,:name => "session_password") button(:loginbtn,:class=> "sign-in-form__submit-btn") def login_with(txtusername, txtpassword) self.txtusername = txtusername self.txtpassword = txtpassword loginbtn end end ` ``
    • 这取决于您使用的访问器。表单字段,例如text_field 访问器,确实创建了一个setter 方法(即#name=)。相反,通常只用于文本的元素,例如div,不会创建setter。您可以在Accessors module 中查看创建的内容。
    【解决方案2】:

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

    msg.click 然后 msg.send_keys('blah')

    或者可能因为它是一个文本框,您可以根据页面的编码方式直接使用它进行操作 - 所以 msg.send_keys('blah') 可以直接工作。

    【讨论】:

    • NoMethodError: undefined method click' for "":String ./features/support/pages/message_page.rb:27:in escribir' ./features/step_definitions/message_steps.rb:19:in /^I'm able to write and send a message$/' ./features/send_messages.feature:13:in Then I can write and send a message' ./features/send_messages .feature:9:in `然后我可以写和发送消息' 1 个场景(1 个失败)4 个步骤(1 个失败,3 个通过)0m13.713s
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2020-11-16
    • 2021-07-15
    • 2011-06-14
    相关资源
    最近更新 更多