Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从design C中删除PageFactory#_C#_Selenium_Page Factory - Fatal编程技术网

C# 从design C中删除PageFactory#

C# 从design C中删除PageFactory#,c#,selenium,page-factory,C#,Selenium,Page Factory,我们在C#中有一个现有的UI自动化框架,并且基于我们使用PageFactory初始化页面文件中的元素时的知识。最近我读了更多关于这个主题的文章,在C#中使用PageFactory似乎没有什么真正的好处,所以我尝试用字段来重新编写页面。我现在有一个问题,那就是让我的扩展方法发挥作用 例如:在当前的实现中,我有一个如下所示的元素: [FindsBy(How=How.LinkText,使用=“Authenticate”)] 私有IWebElement-HomePageHeader public

我们在C#中有一个现有的UI自动化框架,并且基于我们使用PageFactory初始化页面文件中的元素时的知识。最近我读了更多关于这个主题的文章,在C#中使用PageFactory似乎没有什么真正的好处,所以我尝试用字段来重新编写页面。我现在有一个问题,那就是让我的扩展方法发挥作用

例如:在当前的实现中,我有一个如下所示的元素: [FindsBy(How=How.LinkText,使用=“Authenticate”)] 私有IWebElement-HomePageHeader

    public IWebElement getBstHomePageHeader()
    {
        return BstHomePageHeader;
    }
有一个helper方法,用于检查元素在某些情况下是否存在,在测试中它的调用方式如下:

home.getBSHomePageHeader().DoeselementList().Should().BeTrue(“用户未被带到主页”)

“DoesElementExist”方法中的代码应用了5秒钟的等待,持续验证元素。显示检查,并忽略NoTouchElementException、ElementNotVisibleExpection和WebDriverTimeoutException。如果元素没有在5秒内返回,则会向主调用返回false,并抛出fluent断言消息

当我删除PageFactory时,元素现在创建如下(在同一页面文件中): public IWebElement getBSHomePageHeader=>driver.FindElement(By.LinkText(“Authenticate”)

如果我尝试像下面那样对其应用相同的helper方法,那么代码行的DoesElementExist部分将不再适用。NoSuchElementException直接在我的页面文件中抛出,因此不会返回fluent断言消息。 home.getBstHomePageHeader.DoeselementList().Should().BeTrue(“用户未被带到主页”)


在非PageFactory设计中,是否有可能不让page类抛出NoTouchElementException,以便测试能够处理失败?

在java中,您会将异常抛出给调用方。你能用C#做吗

这看起来可能会有所帮助:


旁注:我们也从我们的代码库中删除了页面工厂容器,它更干净了。每个页面类在类的顶部都包含自己所需的元素和选择器。我们还注意到容器中陈旧的元素异常,即使它设置正确。

好吧,值得一提的是,我提出了一个不同的解决方案。我不确定这是不是最好的,但我相信它会奏效。在我的页面文件中,我使用以下内容查找元素:
public IWebElement getBSHomePageHeader=>LookUpElement(By.LinkText(“Authenticate”)我创建了一个基类,它承载LookUpElement方法,看起来像
受保护的IWebElement LookUpElement(通过定位器)
{
尝试
{
返回wait.Until(driver=>driver.FindElement(locator));
}
捕获(无接触元素异常)
{
}
捕获(ElementNotVisibleException)
{
}
捕获(WebDriverTimeoutException)
{
}
返回null;
}

等待逻辑与之前相同。唯一的另一个变化是我改变了在测试中提问的方式。现在看起来是这样的

if(home.getBstHomePageHeader==null)
false.Should().BeTrue(“用户未被带到主页。”);
Log(Status.Pass,“用户在主页上”)


所以,我想我并没有真正回答我自己最初的问题,但这个变通方法似乎奏效了。我们将重新撰写一些关于如何提问的文章。

谢谢您的评论。从属性getter抛出异常并不是最佳实践,所以我认为这不是一个解决方案。如果是这样的话,我就必须把它们全部改成方法,这是我试图避免的,但那仅仅是因为我在C#世界中读到/看到的东西。