1

問題:

ラジオ ボタン webdriver 要素を .Click() すると、それが古くなります (これを行うページを制御できません)。DOM 要素自体は同じです。

目標:

独自のセレクター メソッドを使用して既存の webdriver 要素をリセットし、古くならないようにしたいと考えています。要素がどのように見つかったかを事前に知る必要のない一般的な解決策が必要です。私は既存の古い要素を使用して作業を行いたいと考えています。理想的なケースは次のようになります (例として、次の C# 拡張メソッドを使用します)。

IWebElement refreshedElement = driver.FindElement(staleElement.By());

質問:

既存の要素の場所を公開する方法はありますか? 要素の「アドレス」はどこでも利用できますか? 要素が見つかったときにその要素をアドレス指定する元の方法である必要さえありません。私はそれを気にしません。この情報を取得するためだけにサブクラスを作成する必要はありません。

4

2 に答える 2

0

いいえ、Seleniumは要素を「どのように」見つけたかを追跡していません。率直に言って、それがSeleniumの責任ではないと思います。

RemoteWebElementを継承し、。というメソッドを持つ新しいクラスにラップしRefindElementます。

于 2012-11-08T13:30:18.497 に答える
0

「ページクラス」の概念を追加することを検討することをお勧めします。基本的に、要素をテスト自体に追加する代わりに、要素を返すメソッドを持つ別のクラスを作成します。

たとえば、ログイン ページには 3 つの要素があるため、3 つのメソッドがあります。

public class LoginPage
{
    private IWebDriver driver { get; set; }
    public CSCView_SalesAspx(IWebDriver driver) { this.driver = driver; }

    public IWebElement Id { get { return driver.FindElement(By.Id("login_id")); } }
    public IWebElement Pw { get { return driver.FindElement(By.Id("login_pw")); } }
    public IWebElement SubmitBtn { get { return driver.FindElement(By.Id("submitBtn")); } }
}

あとは、クラスをインスタンス化してからメソッドを操作するだけです。毎回ルックアップを行っているため、要素は常に「新鮮」である必要があります(余分な作業は必要ありません)。

LoginPage loginPage = new LoginPage(driver);
loginPage.Id.SendKeys("myName");
loginPage.Pw.SendKeys("myPw");
loginPage.SubmitBtn.Click();

これの最も良い点は、ページが変更された場合、すべてのテストを書き直す代わりに、1 つのページ クラスを変更するだけで、壊れたテストが修正されることです。

于 2013-08-14T13:35:49.220 に答える