Webdriver:公开现有元素的selector / by / location

时间:2012-11-08 00:56:45

标签: webdriver selenium-webdriver

问题:

.Click() - 一个单选按钮webdriver元素将其存档(无法控制执行此操作的页面)。 DOM元素本身仍然是相同的。

目标:

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

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

问题:

有没有办法公开现有的元素位置?该元素的“地址”是否随处可用?它甚至不必是在找到元素时解决元素的原始方法,我不关心这一点。我只是不必创建一个子类来捕获这些信息。

2 个答案:

答案 0 :(得分:0)

不,Selenium没有跟踪'你如何'找到一个元素,坦率地说,我认为这不应该是Selenium的责任。

我会将它包装到一个新类中,该类继承自RemoteWebElement,并且有一个名为RefindElement的方法。

答案 1 :(得分:0)

我可能会建议考虑添加" Page Class"的概念。基本上,我不是将元素添加到测试本身,而是创建一个单独的类,其中包含返回元素的方法。

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

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

最好的办法是,如果页面发生变化,而不是必须重写每个测试,那么您只需更改一个页面类并修复损坏的测试。