0

私は 2 つのパッケージを持っています。1 つはテスト用のクラスを表し、もう 1 つはページ オブジェクト用です。

テストクラス内で、要素が存在する場合、つまりドロップダウンがある場合は1つのパスをたどり、そうでない場合は別のパスをたどり、結果を検証するロジックを開発したかった

ページオブジェクトパターンがページ上の要素と対話するために使用されることがわかりますが、テストのロジックはどこに行くべきでしょうか。

テストクラスに要素が存在するかどうかのチェックを開始してから、ドライバーオブジェクトを Page オブジェクトクラスに渡すと、作業の重複にはなりません。

ロジックが特定の Web 要素が Web ページに存在するかどうかに基づいている場合、どのような設計アプローチが正しいかわかりません。

ありがとう。

4

2 に答える 2

1

これらのロジックを保持する別のクラス、たとえば UTIL を記述します。また、すべてのテスト データの生成とエラー コードの処理に、この UTIL クラスを使用します。

于 2013-07-26T09:48:19.603 に答える
0

基本的な考え方は、次のようなことです。

try{
    element.isDisplayed();
    return true;
} catch(ElementNotFoundException e){
    return false;
}

このコードの 2 つの場所を見つけました。

1 つ目は、すべてのページが継承するページ クラスです。そのようなクラスがない場合は、Utils クラスが機能します。関数呼び出しは次のようになりますpage.exists(page.getSaveButton())

ただし、私のお気に入りの方法 (もう少しセットアップが必要になります) は、WebElement の周りにラッパー クラスを作成することです (私はそれを EnhancedWebElement と呼びます)。そのコンストラクターは通常の WebElement を受け入れ、各関数呼び出しを WebElement にリダイレクトし、exists() 関数を持っています。

最後に、すべての要素に exists() 関数を持たせるには、DefaultFieldDecorator を拡張し、これらの関数をオーバーライドする必要があります。

@Override
public Object decorate(ClassLoader loader, Field field) {
  if (!(WebElement.class.isAssignableFrom(field.getType())
      || isDecoratableList(field))) {
    return null;
  }

  ElementLocator locator = factory.createLocator(field);
  if (locator == null) {
    return null;
  }

  if (EnhancedWebElement.class.isAssignableFrom(field.getType())) {
    return proxyForLocator(loader, locator);
  } else if (List.class.isAssignableFrom(field.getType())) {
    return proxyForListLocator(loader, locator);
  } else {
    return null;
  }
}
@Override
protected EnhancedWebElement proxyForLocator(ClassLoader loader, ElementLocator locator) {
  InvocationHandler handler = new LocatingElementHandler(locator);

  WebElement proxy= (WebElement) Proxy.newProxyInstance(
    loader, new Class[] {WebElement.class, WrapsElement.class, Locatable.class}, handler);

  return new EnhancedWebElement(proxy);
}

これを実装するには、initElements を呼び出すたびに、次のように呼び出します。

PageFactory.initElements(new EnhancedFieldDecorator(new DefaultElementLocatorFactory(driver)), this);
//Replace EnhancedFieldDecorator with the name of your decorator

これはあなたが求めている以上のものである可能性があり、そうであれば、その最上位の機能があなたが探しているものです。

于 2013-07-26T14:58:43.500 に答える