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);
    }
}

这里是 main 的代码

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

此代码不起作用,因为触发了一个回发...我尝试使用一个显式等待,但它也失败了!用于通过显式等待检索一个元素的代码

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

您可以在 fillData 方法的末尾重新初始化元素。

PageFactory.InitElements(driver, this);

您也可以通过以下方式进行主要操作:

PageFactory.InitElements(driver, registerPersonelData);

您也可以尝试将以下内容添加到需要重用的字段中。

[CacheLookup]
于 2013-05-30T15:29:45.077 回答
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);
    }

因此,我可以等待在选择选项中选择一项后触发的页面加载完成

于 2013-05-31T09:09:50.567 回答