0

私はルビーが初めてです(1.9.3)

私は Selenium WebDriver と C# の中間的な経験があります。Watir-Webdriver に移行したい。

IRB コードの最初のブロックは機能するのに、2 番目のブロックは正しいページをロードするだけで、何もしない理由を突き止めたいと思います。ページはアクティブで、手動入力に応答します。

コードの 2 番目のブロックは、次の PageObject の例に基づいています: https://github.com/cheezy/page-object/wiki/Get-me-started-right-now%21

require 'watir-webdriver'
browser = Watir::Browser.start 'http://x.com/'
browser.select_list(:id, "ddlInterestType").select("Deferred")
browser.select_list(:id, "ddlCompanyName").select("XYZ")
browser.button(:value,"Enter Transactions").click

2番目のブロック

require 'watir-webdriver'
browser = Watir::Browser.new :firefox
browser.goto "http://x.com/"
deferredPage = DeferredPage.new(browser)
deferredPage.interestType.select = 'Deferred'
deferredPage.company.select = 'XYZ'
deferredPage.enterTransactions
class DeferredPage
  include PageObject
  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')
end
4

3 に答える 3

1

ページ オブジェクトのコード例では、ページを読み込んだ後、例外がスローされる可能性があります (何も起こらないように見えます)。そのコードはメソッドなしの例外をスローする必要があります。

undefined method `select=' for "stuff":String

選択リストを宣言すると、次の 3 つのメソッドが作成されます。

  • your_select=- これは選択リストを設定するためのものです
  • your_select- これは選択リストの値を取得するためのものです
  • your_select_element- これは page-object gem 要素を取得するためのものです

を実行するdeferredPage.interestTypeと、選択リストの値である文字列が返されます。文字列にはselect=メソッドがありません。そのため、例外が発生します (そして何もしません)。

2 つの選択は、 なしで行う必要があります.select

deferredPage.interestType = 'Deferred'
deferredPage.company = 'XYZ'

ご覧のとおり、page-object API は watir API とは少し異なります。

于 2013-09-25T13:03:37.423 に答える
1

ページ オブジェクトに関する情報をグーグルで検索しているときに、Alister Scott によるこのページを見つけました。:

http://watirmelon.com/2012/06/04/roll-your-own-page-objects/

私のような愚かな ++ の場合、Watir-Webdriver について詳しく知るまで、彼の方法を使用すると思います。@justinko のコメントに基づいて、現在のところ 1 つの API に固執します。私は自分自身を転がしてみましたが、うまくいきます:

require 'watir-webdriver'
browser = Watir::Browser.new :ie

class DeferredPage
  def initialize( browser )
    @browser = browser
  end

  def enterIntType(intType)
    @browser.select_list(:id, "ddlInterestType").select(intType)
  end

  def clickEnter()
    @browser.button(:value,"Enter Transactions").click
  end
end

dp = DeferredPage.new(browser)

browser.goto "http://x.com"

dp.enterIntType( "Deferred" )
dp.clickEnter    
于 2013-09-27T11:04:54.460 に答える
0

発生しているエラーをお知らせください。あなたが見ている問題は、Ruby インタープリターがコードを読み取る方法に関連していると思われます。ファイルを上から下に読み取り、DeferredPageクラスが定義される前にクラスを使用しています。コードを次のように変更するとどうなるでしょうか。

require 'watir-webdriver'
require 'page-object'
browser = Watir::Browser.new :firefox

class DeferredPage 
  include PageObject
  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')
end

deferredPage = DeferredPage.new(browser)
deferredPage.navigate_to "http://x.com/"
deferredPage.interestType = 'Deferred'
deferredPage.company = 'XYZ'
deferredPage.enterTransactions

この場合、クラスを使用する前にクラスを宣言しています。

私が提案するもう 1 つのことは、データ入力を実行するためのより高いレベルのメソッドを作成することです。たとえば、コードを次のように変更できます。

require 'watir-webdriver'
require 'page-object'
browser = Watir::Browser.new :firefox

class DeferredPage 
  include PageObject

  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')

  def do_something(interest, company)
    self.interestType = interest
    self.company = company
    enterTransactions
  end
end

deferredPage = DeferredPage.new(browser)
deferredPage.navigate_to "http://x.com/"
deferredPage.do_someting('Deferred', 'XYZ')

これはよりクリーンです。ページへのアクセスは、何らかのビジネス価値を追加するメソッドの背後で抽象化されます。

-安っぽい

于 2013-09-25T20:53:52.983 に答える