当前位置: 首页 > 知识库问答 >
问题:

如何在Selenium C#中防止PageFactory中的StaleElementReection ceException?

盖昀
2023-03-14

我在C#6中有一个Selenium WebDriver页面对象模型。在尝试单击ajax加载的导航栏元素时,我遇到了StaleElementReferenceException。这很混乱,因为我使用的是页面工厂,没有任何缓存查找。

这是有问题的代码。我试着把重要的部分简单化。(我实际上传递了一个驱动程序,一个包装器,包装了IWebDriver)<代码>菜单栏。选择英语

public class Tests
{
    [Test]
    public void SelectEnglishTest()
    {
        homePage
            .MenuBar.SelectEnglish<HomePage>();
    }

    // ...
}

public class MenuBar : PageObject
{
    [FindsBy(How = How.CssSelector, Using = "...")]
    private IWebElement Language { get; set; }

    [FindsBy(How = How.CssSelector, Using = "...")]
    private IWebElement English { get; set; }

    public T SelectEnglish<T>() where T : Page
    {
        Language.Click();
        IWait<IWebDriver> wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(5));
        wait.Until(ExpectedConditions.ElementToBeClickable(English));
        English.Click();
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
        return (T)Activator.CreateInstance(typeof(T), Driver);
    }

    // ...
}

public class HomePage : PageObject
{
    public MenuBar MenuBar { get; private set; }

    // ...
}

public class PageObject
{
    protected IWebDriver Driver { get; }

    protected PageObject(IWebDriver driver)
    {
        Driver = driver;
        PageFactory.InitElements(this, new RetryingElementLocator(Driver, TimeSpan.FromSeconds(20)));
    }

    // ...
}

导致此错误的原因是什么?我该怎么办?

共有1个答案

赵星华
2023-03-14

从文档中,陈旧元素引用异常

A stale element reference exception is thrown in one of two cases, the first being more common than the second:
 - The element has been deleted entirely.
 - The element is no longer attached to the DOM.

由于您提到元素是使用Ajax加载的,因此很可能是在页面对象获取元素后该元素发生了更改。只需再次获取它,或者等待Ajax完成,然后再获取受影响的元素。

编辑1

下面是一些示例代码,演示如何在使用PageFactory的同时使用方法获取元素。

using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.PageObjects;
using System;

namespace C_Sharp_Selenium_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            FirefoxDriver driver = new FirefoxDriver();
            driver.Navigate().GoToUrl("http://www.google.com");
            HomePage homePage = new HomePage(driver);
            PageFactory.InitElements(driver, homePage);
            homePage.search("stack overflow");
            homePage.getSearchBox().Clear();
            homePage.getSearchBox().SendKeys("c# pagefactory");
            homePage.getSearchButton().Click();
        }
    }

    public class HomePage
    {
        private By searchBox = By.Id("lst-ib");
        private By searchButton = By.Name("btnG");

        // add other elements in here that use FindsBy() to be loaded using PageFactory.InitElements()

        private IWebDriver driver;

        public void search(String s)
        {
            getSearchBox().SendKeys(s);
            getSearchButton().Click();
        }

        public IWebElement getSearchBox()
        {
            return driver.FindElement(searchBox);
        }

        public IWebElement getSearchButton()
        {
            return driver.FindElement(searchButton);
        }

        public HomePage(IWebDriver driver)
        {
            this.driver = driver;
        }
    }
}
 类似资料:
  • 我在Jenkins的Build Executor Status面板中单击了一个作业名称旁边的[x]按钮,中止了该作业,但该作业仍然存在并等待。 即使我重新启动Jenkins它也会恢复构建。当我看一下控制台时,我看到: 向进程发送中断信号单击此处强制终止运行步骤。伊奥。IOException:正在中止sun的构建。反映国家建筑配件公司。sun的newInstance0(本机方法)。反映国家建筑配件公

  • 问题内容: 我认为这是一个普遍的问题,不需要从我的图表中获取太多信息。 我想防止列彼此重叠/重叠,该怎么办? 请参阅下面的图像链接,了解现在的情况 http://highslide.com/forum/download/file.php?id=3157 jsfiddle:http : //jsfiddle.net/Dzs5q/ 问题答案: 请尝试在此处重现该错误@ http://jsfiddle.

  • 问题内容: 使用不同的Java库执行数百万个HTTP请求,使我陷入困境: 这是功能。 我试图设置Apche Http Client,并在所有可能的超时(我希望)上超时,但仍然 (可能无限)挂起。如何摆脱它们? 挂断率大约是每10000个请求〜1(对10000个不同的主机),并且可能会永远持续下去(我已确认线程挂起在10小时后仍然有效)。 Windows 7上的JDK 1.8。 我的工厂: 我的工厂

  • 如果使用隐式和显式等待器,将发生以下错误:

  • 问题内容: 考虑以下HTML: 和以下CSS: 就目前情况而言,Firefox目前与以下内容类似: 注意,第四项在第二和第三列之间分配。我该如何预防? 所需的渲染可能更像: 要么 编辑: 仅指定宽度以演示不需要的渲染。在实际情况下,当然没有固定的宽度。 问题答案: 正确的方法是使用闯入式CSS属性: 不幸的是,截至2019年10月,Firefox不支持此功能,但其他所有主流浏览器均支持此功能。使用

  • 问题内容: 我们有三个Web服务(,,),其中每个服务映射到一个方法(在一个单独的Java类)( ,,)。 只能同时运行一项服务(即:无法在运行时运行)。但是,由于这是REST API,因此无法阻止客户端请求并发运行的服务。 在服务器上 强制 服务 不能 同时运行的最佳和最简单的方法是什么? 更新 :这是一个内部应用程序,我们的负载不会很大,只有一台应用程序服务器。 更新 :这是一个主观的问题,因