Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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# 硒C元素不含“元素”;按定位器“;_C#_Selenium_Webdriver - Fatal编程技术网

C# 硒C元素不含“元素”;按定位器“;

C# 硒C元素不含“元素”;按定位器“;,c#,selenium,webdriver,C#,Selenium,Webdriver,我和SeleniumWebDriver一起工作了几个星期,我的项目几乎完成了,但有些事情让我失去了耐心 在我的项目中,我将所有内容划分为类,因此有一个类,我在其中放置元素,声明为以下示例(在同一个类中,我将在测试中实现的函数): 我的职责之一是: private void ClickConfirmButtonIfVisible() { if (GenericConfirmButton.IsVisible()) GenericConfirmB

我和SeleniumWebDriver一起工作了几个星期,我的项目几乎完成了,但有些事情让我失去了耐心

在我的项目中,我将所有内容划分为类,因此有一个类,我在其中放置元素,声明为以下示例(在同一个类中,我将在测试中实现的函数):

我的职责之一是:

    private void ClickConfirmButtonIfVisible()
    {
        if (GenericConfirmButton.IsVisible())
            GenericConfirmButton.SetClick();
    }
函数IsVisible()执行以下代码(在另一个类中):

因此,我的问题是:这个函数IsVisible()执行大约需要5秒钟(如果元素不存在)。我这样做的目的是,如果我点击按钮“Confirmar”,它必须检查元素是否存在,如果不存在,则返回false

我已经尝试使用ElementExists而不是elementtobelickable,但是我不知道怎么做(因为我使用一个分离的类来声明IWebElement元素,这个函数需要一个By声明)。我想使用元素exists(我相信它会比现在运行得更快)。或者,如果你知道任何其他的方法并且能帮助我,我真的会原谅你的


就这些。谢谢

它正在等待5秒,因为在代码中的某个地方,您正在驱动程序上设置
隐式等待
。您可以删除它,但如果您有其他依赖于隐式等待的测试,则这些测试可能会受到影响

一般来说,我建议只使用显式等待,将显式隐式等待与意外等待时间结合使用


通过避免逻辑中的
if
语句,确保测试逻辑不会变得太聪明,也可以避免这个问题。在本例中,基本上您的测试用例应该知道按钮是否存在,因此逻辑应该反映这一点。

您是否尝试过用CSS选择器替换XPath选择器?这篇文章建议CSS选择器的性能更高:嗯,还没有,因为我正在执行测试的站点上的元素是99%动态的,所以我做的所有研究都说要使用XPath选择器。无论如何,我将尝试CSS选择器。谢谢这很难,因为如果你有它立即返回。。。如果您等待半秒钟,该元素就会存在,该怎么办?这就是为什么我在测试逻辑中尽量避免使用if语句。如果您可以编写逻辑来知道它是否应该可见(您应该在测试用例中知道),那么这就是您应该做的。对我来说,这是测试逻辑过于聪明的一个标志,这通常会导致挫折。@freester先生,这是正确的。我在乞讨中遵循了这条路线,但我有一个疯狂的想法,让Selenium为我采取行动。因此,正如您所建议的,我将编写代码来遵守这些步骤(即使这是完全可能的)。非常感谢!伟大的我希望@EvelynHarumi对您有效。旁注:听起来您在代码中的某个地方设置了一个隐式等待5秒钟。我选择了从不设置隐式等待,而只使用显式等待,就像您对
WebDriverWait
所做的那样。还有一种可能来自混合显式和隐式等待。
    private void ClickConfirmButtonIfVisible()
    {
        if (GenericConfirmButton.IsVisible())
            GenericConfirmButton.SetClick();
    }
    public static bool IsVisible(this IWebElement element)
    {
        try
        {
            new WebDriverWait(GeneralProperties.Driver, TimeSpan.FromMilliseconds(0))
                .Until(ExpectedConditions.ElementToBeClickable(element));
            if (element.Enabled && element.Displayed)
            {
                return true;
            }
            else
            return false;
        }
        catch (WebDriverTimeoutException)
        {
            return false;
        }
    }