- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 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/
我刚刚开始使用带有 webdriver 的 geb 进行自动化测试。 As I understand it ,当我在页面上定义内容时,每次调用内容定义时都应该查找页面元素。 //In the cont
我有一个非常简单的脚本,可以找到页面中的所有 HREF 并迭代并记录它: Photo search scroll Go To https://xxx ${elements}=
我正在为鼠标悬停工作,我想通过使用 for 循环单击每个链接来测试所有链接的工作状况。在我的程序中,迭代进行一次,而对于下一次迭代,它不起作用并显示“StaleElementReferenceExce
在我的网页上,我有一个部分链接列表,每个部分都有详细信息的链接。我尝试转到每个部分,然后验证所有链接都没有损坏。 List sections = driver.findElements(By.xpat
我有一个场景,我试图循环遍历条形图上的多个元素,直到找到“rect”标签名称。当我单击“矩形”标签名称时,将从图表中选择单个栏,并且我将重定向到另一个页面。请参阅下面我正在使用的条形图的图像: /im
我已经研究这个错误一段时间了,并尝试了很多方法,但似乎没有任何效果...... while(!driver.findElements(By.className("next")).isE
您好,我是 Selenium 的新手 我正在使用 Java 库,已经尝试了 Chrome 和 Firefox 驱动程序。 我正在运行一个循环。有趣的是,循环有时工作 3、2 次,它并不总是在同一次迭代
我正在测试新建的框架,在 Chrome 浏览器中工作时经常遇到 org.openqa.selenium.StaleElementReferenceException。框架设计会不会有问题?当我在其他浏
显示堆栈溢出错误 public static void main(String[] args) throws Exception { System.setProperty("webdriver
我在这样的测试中有wait: WebDriverWait wait = new WebDriverWait(dr, TimeSpan.FromSeconds(30)); ... wait.Until(
好吧,伙计们...我知道这个问题之前似乎已经得到解答,但我尝试了几种解决方案,但没有一个奏效。如果我再看到一次 StaleElementReferenceException,我就会丢掉它。我妻子的男朋
导航到不同页面并返回后,我收到 StaleElementReferenceException。我尝试过显式等待,再次重写定位器,但似乎不起作用。任何帮助将不胜感激。 Select select
我尝试用selenium 制作一个网络爬虫。我的程序引发 StaleElementReferenceException。我认为这是因为我递归地抓取页面,并且当页面没有更多链接时,该函数导航到下一页,而
我需要获取快速变化元素的值(在本例中是一个以毫秒为单位倒计时的计时器),但是当我尝试使用时 String timeLeftString = driver.findElement(By.xpath(ti
我有一个包含一堆表格的页面。我在外循环中遍历表,然后在内循环中遍历表中的每一行。一切正常。但是有些页面有下一步按钮。当我在完成页面后添加代码以单击它时,我开始在循环遍历表格的行时收到 StaleEle
在我的 Selenium 测试代码中有几行 点击一个复选框 从选择框中选择一个项目 点击按钮提交表单 这是代码 WebElement selectAllElement = driver.findEle
我在 Ubunto 上运行 Web E2E 测试(使用 cucumber、junit、selenium webDriver)。 使用remoteWebDriver时,我的测试偶尔失败(使用local-
我一直在使用 protractor/jasmine2 解决陈旧元素引用异常的问题。 我的规范: var LoginPage = require('../pages/login_page.js'); v
这个问题已经有答案了: Stale element exception python (2 个回答) Selenium clicks one time, but next click returns
运行测试时出现此错误:org.openqa.selenium.StaleElementReferenceException: 元素不再附加到 DOM 关于如何解决上述异常的任何想法?这发生在我的网格中
我是一名优秀的程序员,十分优秀!