1

问题:

.Click()-ing 单选按钮 webdriver 元素使其陈旧(无法控制执行此操作的页面)。DOM 元素本身还是一样的。

目标:

我想使用自己的原始选择器方法重置现有的 webdriver 元素,使其不再过时。我想要一个不需要提前知道元素是如何找到的通用解决方案。我想使用现有的陈旧元素来完成这项工作。理想情况看起来像这样(仅出于示例目的使用以下 C# 扩展方法):

IWebElement refreshedElement = driver.FindElement(staleElement.By());

问题:

有没有办法公开现有元素的位置?元素的“地址”在任何地方都可用吗?它甚至不必是找到元素时寻址元素的原始方法,我不在乎。我宁愿不必为了捕获这些信息而创建一个子类。

4

2 回答 2

0

不,Selenium 不会跟踪您“如何”找到元素,坦率地说,我认为这不应该是 Selenium 的责任。

我会将它包装到一个新类中,该类继承自RemoteWebElement,并有一个名为RefindElement.

于 2012-11-08T13:30:18.497 回答
0

我可能会建议考虑添加“页面类”的概念。基本上,我没有将元素添加到测试本身,而是创建了一个单独的类,该类具有返回元素的方法。

例如,登录页面将包含三个元素,因此有 3 个方法:

public class LoginPage
{
    private IWebDriver driver { get; set; }
    public CSCView_SalesAspx(IWebDriver driver) { this.driver = driver; }

    public IWebElement Id { get { return driver.FindElement(By.Id("login_id")); } }
    public IWebElement Pw { get { return driver.FindElement(By.Id("login_pw")); } }
    public IWebElement SubmitBtn { get { return driver.FindElement(By.Id("submitBtn")); } }
}

现在您所要做的就是实例化该类,然后与该方法进行交互。您的元素应该始终是“新鲜的”,因为您每次都在进行查找(无需任何额外工作)。

LoginPage loginPage = new LoginPage(driver);
loginPage.Id.SendKeys("myName");
loginPage.Pw.SendKeys("myPw");
loginPage.SubmitBtn.Click();

最好的一点是,如果页面发生更改,您不必重写每个测试,只需更改一个页面类即可修复损坏的测试。

于 2013-08-14T13:35:49.220 回答