当前位置: 首页 > 面试题库 >

调用FindElements后,selenium停止工作

凌声
2023-03-14
问题内容

有时,当我调用Selenium FindElements(By)时,它将引发异常,并且驱动程序停止工作。参数“
BY”可能是问题所在:当我使用其他BY搜索相同的元素时,它起作用了。

我也可以看到,即使我的元素存在,或者之前曾调用过带有相同参数的相同方法,也不会阻止该方法引发异常。

我的方法是:

    public IWebElement SafeFindElement(By by)
    {
        try
        {
            IWebElement element;
            if (_driver.FindElements(by).Any())
            {
                element = _driver.FindElements(by).First();
                return element;
            }

            return null;
        }
        catch (NoSuchElementException)
        {
            return null;
        }
        catch (Exception)
        {
            return null;
        }
    }

一个BY值的示例并非始终有效(即使它存在于页面中):

By.CssSelector("input[data-id-selenium='entrar']")

例外:

WebDriverException

到远程WebDriver服务器的URL http:// localhost:46432 / session /
ef6cd2f1bf3ed5c924fe29d0f2c677cf /
elements
的HTTP请求
在60秒后超时。

我不知道这可能是什么或导致这种不稳定的原因。有人建议吗?

@编辑

我找到了一个临时解决方案。

早期,我尝试使用以下方法查找元素:

var element = browser
    .FindElements(By.CssSelector("input[data-id-selenium='entrar']")
    .FirstOrDefault();

要么

var element = browser
    .FindElements(By.XPath("//input[@data-id-selenium='entrar']");
    .FirstOrDefault();

现在,我正在使用:

var element = browser
    .FindElements(By.TagName("input"))
    .FirstOrDefault(x => x.GetAttribute("data-id-selenium") == "entrar");

他们做同样的事情,但是首先会无故抛出异常。另外,这是一个临时解决方案,我正在尝试解决仅使用选择器搜索元素的问题。


问题答案:

我发现了问题。我在所有测试服中都使用一种方法来等待加载消息关闭。但是它尝试使用jquery,但并非我的应用程序中的所有页面都使用它。

因此,Selenium放弃尝试在60秒后执行jquery并返回超时错误,但是此错误不会破坏Selenium驱动程序,只有FindElements才返回空列表。当它尝试返回空列表时,所有驱动器都坏了。

原始方法:

public void WaitLoadingMessage(int timeout)
{
    while (timeout > 0)
    {
        try
        {
            var loadingIsVisible = _js.ExecuteScript("return $('#loading-geral').is(':visible');").ToString();

            if (loadingIsVisible.ToLower() == "false")
                break;

            Thread.Sleep(1000);
            timeout -= 1000;
        }
        catch (Exception ex)
        {
            if (!ex.Message.ToLower().Contains("$ is not defined"))
                throw;
        }
    }
}

和更正:

public void WaitLoadingMessage(int timeout)
{
    while (timeout > 0)
    {
        try
        {
            var loadingIsVisible = _js.ExecuteScript("return $('#loading-geral').is(':visible');").ToString();

            if (loadingIsVisible.ToLower() == "false")
                break;

            Thread.Sleep(1000);
            timeout -= 1000;
        }
        catch (Exception ex)
        {
            if (!ex.Message.ToLower().Contains("$ is not defined"))
                throw;

            break;
        }
    }
}


 类似资料:
  • 我的程序需要允许用户输入员工姓名和年度总销售额。当用户完成将员工添加到阵列中时,程序应确定哪些员工的销售额最高,哪些员工的销售量最低。然后,它应该打印出两个数字之间的差异。 在我下面的代码中,我有一个保存用户输入的年销售额的totalPay类(它包括以前赋值中的其他变量和方法,这里没有使用)。salesPerson类保存雇员的姓名和totalPay对象,其中包括他们的年销售额。(我意识到这太复杂了

  • 我正在尝试测试下面的http请求方法 但是,调试器似乎跳过了第二个注释下面的代码。我正在使用Visual Studio 2015 RC,有什么想法吗?我也试着检查任务窗口,什么也没看到 编辑:找到解决方案 事实证明,因为这是一个C#控制台应用程序,所以我猜它在主线程结束后结束,因为在添加控制台之后。ReadLine()并等待一段时间,请求确实返回了。我猜想C#会等到我的任务执行后才结束,但我想我错

  • 由于依赖关系中的冲突,我想为io.netty添加阴影。着色后,本机ssl库(netty-tcnative-boringssl-static)的加载将停止工作。 主pom pubsub有以下3个依赖项:、和 错误 当尝试加载本机库时会出现问题。它给我的错误如下: 我已经查看了主POM生成的jar内部。并且没有与该名称匹配的本机库。这是在meta-inf/native目录中: 我做错了什么?我如何在不

  • null GrantPermissionRule是否停止了为其他人所宣传的工作?

  • 问题内容: 在ajax调用后,我无法停止刷新页面。我已经尝试通过放置e.preventDefault(); 并返回false;同样,但我的页面再次刷新。 我不知道代码或某些问题是什么。请帮助我在ajax调用后停止刷新页面。解决这个问题将对我有很大的帮助。提前致谢。 这是我的代码: 问题答案: ID是否指向表单?如果是,则需要侦听Submit事件而不是单击click。如果您确实需要监听click事件

  • 在过去的几天里,我一直在使用这段代码,直到今天,它一直工作得很好,但由于某种原因,异步任务已经停止调用doInBackground方法。我尝试了这里建议的解决方案,Android SDK AsyncTask doInBackground没有运行(子类),但我得到了相同的结果。onPreExecute方法被调用,但我只剩下加载对话框。有没有人经历过类似的事情。我已经附上了我的代码副本。MyAsncT