首页 文章

C#中的Selenium WebDriver - “By”类扩展

提问于
浏览
1

我一直在一个webdriver项目中自动化我的测试,我尝试开发类似帮助器的东西 . 默认情况下,By类方法有CssSelector(),XPath(),ClassName()等 .

我的问题是:可能(以及如何?!)我可以扩展这个类来创建另一种方法来简化我的代码?我希望By调用我自己的方法 . 我搜索并获得了一些结果如何创建NewBy,但我认为它可以使我的代码在未来变得杂乱无章 .

Selenium中默认存在的内容:

FindElement(By.CssSelector("#example"));

我正在努力发展:

FindElement(By.MyOwnMethod("example"));

谢谢!

3 回答

  • 1

    简而言之,你不应该让你的代码变得更干净,这使得它更难以阅读,因为其他任何有Selenium经验的人都没有添加另一层抽象,只需使用Selenium编写 . 如果您有HTML,其中有多个管理菜单只有索引不同,例如 By.CssSelector("[selenium-admin-menu='3']") 然后编写一个接受索引并返回正确元素的函数 .

    public WebElement getAdminMenu(int index)
    {
        return driver.findElement(By.cssSelector("[selenium-admin-menu='" + index + "']"));
    }
    

    或者更好的是,根据每个管理菜单的实际名称为每个管理菜单创建一个函数,以便该函数的使用者将确切知道该函数的功能,并且不必查看页面的HTML并计算管理菜单以返回正确的一 .

    public WebElement getAdminMenuManageUsers()
    {
        return driver.findElement(By.cssSelector("[selenium-admin-menu='1']"));
    }
    
    public WebElement getAdminMenuManageSite()
    {
        return driver.findElement(By.cssSelector("[selenium-admin-menu='2']"));
    }
    

    很明显,这些都是例子,因为我不知道你的网站 .

  • 3

    在css中, # 符号是ID选择器 . 您可以使用 By.Id(string) 方法 .


    编辑:

    如果您真的想要自定义它,可以定义自己的 By 实现 . 但是你可以't extend static method, therefore you will need create a new class to host them. I' ll在这里使用 Via ,你可以随时使用更有意义的名字,比如网站名称:

    public class Via
    {
        public static By AdminMenu(string Id) // could also just use int
        {
            return By.CssSelector(string.Format("[selenium-admin-menu='{0}']", Id));
        }
    
        public static By ImgSrc(string source)
        {
            return By.CssSelector(string.Format("img[src='{0}']", source));
        }
    }
    
    //usage: 
    var menu3 = driver.FindElement(Via.AdminMenu("3"));
    
  • 3

    如果您希望驱动程序具有使用特定于用例的DOM的快捷方式,则可以始终扩展 IWebDriver 而不是 By .

    using OpenQA.Selenium;
    
    namespace Tests.Selenium.Utils
    {
        public static class DriverExtensions
        {
            public static IWebElement FindAdminMenu(this IWebDriver driver, string Id)
            {
                return driver.FindElement(By.CssSelector(
                    string.Format("[selenium-admin-menu='{0}']", Id)
                ));
            }
        }
    }
    

    那么这一行from Xiaoy312 ......

    var menu3 = driver.FindElement(Via.AdminMenu("3"));
    

    减少到

    var menu3 = driver.FindAdminMenu("3");
    

    JeffC's critique是一个有趣的 . FindAdminMenu 可能是不透明的,特别是如果你可以更好地使用人类可读的类名,如果你可以改变编写DOM的方式 .

    对于人类可读的类,我不会那么做Page Object ModelingPage Object Modeling没那么太不同,对于Selenium来说,我认为通常是一件好事 . POM将保持测试的动作/业务逻辑层从DOM更改中抽象出来 . 并且会有DOM更改[比业务逻辑更改更常见] . ; ^)

相关问题