gpt4 book ai didi

c# - 如何防止 Selenium C# 中 PageFactory 中的 StaleElementReferenceException?

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:41 26 4
gpt4 key购买 nike

我在 C# 6 中有一个 Selenium WebDriver 页面对象模型。我遇到了 StaleElementReferenceException s 同时尝试单击加载了 ajax 的导航栏元素。这很令人困惑,因为我正在使用 PageFactory , 没有任何 [CacheLookup]

这是有问题的代码。我试图只简化重要部分。 (我实际上传递了一个 Driver ,一个围绕 IWebDriver 的包装。) MenuBar.SelectEnglish<T>()抛出异常。

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

// ...
}

是什么导致了这个错误?我该怎么办?

最佳答案

来自文档,Stale Element Reference Exception

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

关于c# - 如何防止 Selenium C# 中 PageFactory 中的 StaleElementReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32209199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com