我看了一下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
的错误
不管是显示等待还是隐式等待,不一定说非要等待多少秒后才会提示元素找不到的错误,你提供的现象中,设置了显示等待,但不到10秒就提示错误是正常的。你要理解你设置的180秒是指超时时间,并不是指等待时间,也就是说如果查找元素的时间超过180秒还没有找到,则会报找不到元素的错误,那如果在10秒内,元素都查找完了,确定没有发现这个元素 ,则不需要等待180秒后再抛出异常,直接就会告诉你元素找不到。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
通过您的描述,我了解到您使用C#的Selenium进行测试时,出现了显示等待无效、无法找到元素等问题。这些问题可能与以下因素有关:
关于这些问题,以下是具体的解决方案和代码示例:
可以尝试使用隐式等待来解决这个问题。隐式等待是设置一个全局的等待时间,当使用FindElement()
方法查找元素时,如果找不到,则会等待一段时间,直到超时时间到达为止。以下是一个示例代码片段:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
以上代码会将隐式等待设置为30秒。您可以根据实际情况进行调整。
可以尝试使用显式等待,并且使用更加精准的元素定位方式,例如使用By.Id
或By.XPath
等方法。以下是一个示例代码片段:
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementExists(By.Id("element-id")));
以上代码会等待直到ID为“element-id”的元素存在于DOM中。您可以根据实际情况进行调整。
可以检查您使用的显示等待条件是否正确并按预期工作。以下是一个示例代码片段:
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));
以上代码会等待直到ID为“element-id”的元素可见。如果元素不可见或在超时时间内未出现,等待将失败。
总的来说,显示等待和隐式等待都是WebDriver中常用的等待机制。需要根据具体情况进行选择,并且设置条件时需要根据实际情况进行调整。希望以上的解决方案可以帮助您解决问题。
如果我的回答解决了您的问题,请采纳!
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");
}
}