0

「選択」コントロールから値を選択する Selenium 2 テスト (C# で記述) を使用しています。選択すると、サーバーへのポストバックが発生し、ページの状態が更新されます。

PostBack が発生するたびにこの例外 Element not found in the cache が発生するため、非常にイライラします。ページが検索されてから変更された可能性があります。

正確に言うと、Selenium 2 WebDriver (2.32.0.0) を使用し、私のプロジェクトではPattern Page Factoryを使用します

コードはそのように見えます

class RegisterPersonelData
{
    private IWebDriver driver;

    [FindsBy(How = How.Id, Using = "ctl00_ContentMain_register1_txtName")]
    private IWebElement txtLastname;
    [FindsBy(How = How.Id, Using = "ctl00_ContentMain_register1_lstDrvLic")]
    private IWebElement dlDrive;
    private SelectElement selectDrive;

    [FindsBy(How = How.Id, Using = "ctl00_ContentMain_register1_lstVeh")]
    private IWebElement dlVehicule;
    private SelectElement selectVehicule;

    public RegisterPersonelData(IWebDriver driver)
    {
        this.driver = driver;
        // initialize elements of the LoginPage class
        PageFactory.InitElements(driver, this);
        // all elements in the 'WebElements' region are now alive!
        // FindElement or FindElements no longer required to locate elements
    }
    public void fillData(string lastname, string drive, string vehicule)
    {
        txtLastname.SendKeys(lastname);
        this.selectDrive = new SelectElement(dlDrive);
        selectDrive.SelectByText(drive);             

        selectVehicule = new SelectElement(dlVehicule);
        IWait<IWebDriver> wait = new WebDriverWait(this.driver, TimeSpan.FromSeconds(Convert.ToInt32(ConfigurationManager.AppSettings["ExpliciteWait"])));
        wait.Until(x => selectVehicule.Options.Count > 1);
        selectVehicule.SelectByText(vehicule);
    }
}

そして、ここにメインのコード

class Program
{
    static void Main()
    {
        IWebDriver driver = MyWebDriver.GetWebDriver(MyWebDriver.BrowserType.FIFREFOX);
        driver.Navigate().GoToUrl("http://...");
        ...
        registerPersonelData.fillData("lastname", "Permis B", "Auto");
     }
 }

1 つのポストバックがトリガーされるため、このコードは機能しません。明示的な待機を 1 つ使用しようとしましたが、これも失敗します。明示的な待機で 1 つの要素を取得するためのコードの使用

public static IWait<IWebDriver> GetWaitWebDriver(IWebDriver driver)
    {
        IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(Convert.ToInt32(ConfigurationManager.AppSettings["ExpliciteWait"])));
        return wait;
    }

    public static IWebElement GetElementAndWaitForIt(IWebDriver driver, By by)
    {
        return GetWaitWebDriver(driver).Until(x => 
        {
            return x.FindElement(by);
        });
    }

誰かがそれを修正するためのアイデアを持っていますか?

4

2 に答える 2

0

私は多くの試みを行ってきましたが、最終的に何か有用なものを見つけました

public static void WaitForAnWebElementDisplayed(IWait<IWebDriver> wait, IWebElement webElement)
    {
        wait.Until(x => webElement.Displayed);
    }

    public static void WaitForAnWebElementEnabled(IWait<IWebDriver> wait, IWebElement webElement)
    {
        wait.Until(x => webElement.Enabled);
    }

したがって、選択オプションで1つのアイテムを選択した後にトリガーされるページのロードが完了するのを待つことができます!

于 2013-05-31T09:09:50.567 に答える