c#的Selenium的显示等待,不起效果

img


一,如果普通的获取元素,是没问题的(这个说明是配置没问题的吧)。
二,我故意写了个“n个a”的不存在的元素,测试显示等待,设置的时间是180秒,可是刚不到10秒就报错,找不到元素。
查了很多资料也都没解决,谢谢呀。

img


是不是这些问题导致的,我运行起来有这个报错。

我看了一下WebDriver的源码,可以看到,如果未找到元素,会抛出一个 NoSuchElementException

internal IWebElement GetElementFromResponse(Response response)
{
    if (response == null)
    {
        throw new NoSuchElementException();
    }
    WebElement element = null;
    Dictionary<string, object> elementDictionary = response.Value as Dictionary<string, object>;
    if (elementDictionary > null)
    {
        element = this.elementFactory.CreateElement(elementDictionary);
    }
    return element;
}

再看到Until的源码

public virtual TResult Until<TResult>(Func<T, TResult> condition, CancellationToken token)
        {
            ....
            while (true)
            {
                try
                {
                    TResult val = condition(input);
                    ...
                }
                catch (Exception ex)
                {
                    if (!IsIgnoredException(ex))
                    {
                        throw;
                    }

                    lastException = ex;
                }
                ...
            }
        }

这里这个IsIgnoredException就会忽略你在wait.IgnoreExceptionTypes函数添加的异常类型。

所以你这里显示这个异常,不是程序报错,是Visual Studio调试工具的提醒。

我将测试代码改成如下:

wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
            try
            {
                var ele = wait.Until(bb =>
                bb.FindElement(By.Id("aaaaaaaaaa"))
            );
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

直接运行编译后的程序,只会收到一个超时的错误,并不会收到NoSuchElementException的错误

img

不管是显示等待还是隐式等待,不一定说非要等待多少秒后才会提示元素找不到的错误,你提供的现象中,设置了显示等待,但不到10秒就提示错误是正常的。你要理解你设置的180秒是指超时时间,并不是指等待时间,也就是说如果查找元素的时间超过180秒还没有找到,则会报找不到元素的错误,那如果在10秒内,元素都查找完了,确定没有发现这个元素 ,则不需要等待180秒后再抛出异常,直接就会告诉你元素找不到。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
通过您的描述,我了解到您使用C#的Selenium进行测试时,出现了显示等待无效、无法找到元素等问题。这些问题可能与以下因素有关:

  1. 网页元素加载速度过慢或不稳定;
  2. 页面结构或元素定位发生了变化;
  3. 显示等待的条件设置不正确。

关于这些问题,以下是具体的解决方案和代码示例:

  1. 网页元素加载速度过慢或不稳定

可以尝试使用隐式等待来解决这个问题。隐式等待是设置一个全局的等待时间,当使用FindElement()方法查找元素时,如果找不到,则会等待一段时间,直到超时时间到达为止。以下是一个示例代码片段:

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);

以上代码会将隐式等待设置为30秒。您可以根据实际情况进行调整。

  1. 页面结构或元素定位发生了变化

可以尝试使用显式等待,并且使用更加精准的元素定位方式,例如使用By.IdBy.XPath等方法。以下是一个示例代码片段:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementExists(By.Id("element-id")));

以上代码会等待直到ID为“element-id”的元素存在于DOM中。您可以根据实际情况进行调整。

  1. 显示等待的条件设置不正确

可以检查您使用的显示等待条件是否正确并按预期工作。以下是一个示例代码片段:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));

以上代码会等待直到ID为“element-id”的元素可见。如果元素不可见或在超时时间内未出现,等待将失败。

总的来说,显示等待和隐式等待都是WebDriver中常用的等待机制。需要根据具体情况进行选择,并且设置条件时需要根据实际情况进行调整。希望以上的解决方案可以帮助您解决问题。
如果我的回答解决了您的问题,请采纳!

该回答引用ChatGPT
根据问题描述和截图,有以下几个可能的问题:

1. 等待的元素定位器不正确,导致等待时间内找不到元素;
2. 等待超时时间设置过短,导致在规定时间内仍未找到元素而报错;
3. 浏览器驱动和Selenium版本不匹配或者与浏览器版本不兼容,导致出现错误信息。

针对这些可能的问题,可以考虑采用以下方式进行排查:

1. 确认元素定位器是否正确,可以通过在浏览器控制台进行元素定位并验证,或者使用其他元素定位方式进行测试;
2. 增加等待超时时间,如果发现等待时间过长,可以适当缩短等待时间,但不要过于缩短;
3. 确认浏览器驱动和Selenium版本是否匹配,可以在Selenium官网查看支持的浏览器和驱动版本,如果出现兼容性问题,可以升级或降级驱动和Selenium版本。

下面是一个使用C#和Selenium的显示等待方法的代码示例:

csharp
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;

class Program
{
static void Main(string[] args)
{
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.baidu.com");
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("kw")));
element.SendKeys("Selenium");
}
}


该示例中,使用了显示等待方法ExpectedConditions.ElementIsVisible,通过指定最长等待时间和元素定位器的方式等待元素的可见性,如超时时间内找到元素,则返回该元素,否则将抛出异常。