这是我在这里的第一个问题,所以请裸露:)
我正在尝试让Selenium Webdriver等待直到可见一个Element,否则应使用else。
这是我的代码,抛出system.argumentexception路径不是合法形式。
if (driver.FindElement(By.Id("ember20"), timeout).Displayed)
{
doXX();
}
else if (driver.FindElement(By.Id("ember19"), timeout).Displayed)
{
doXX2();
}
public static class WebDriverExtensions
{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(by)).FindElement(by);
}
}
答案 0 :(得分:0)
我遇到了同样的问题,在我的情况下,nuget-package Costura 是问题所在。该软件包将所有引用的.dll捆绑在一起,并将其嵌入到exe中。
我删除了所有依赖关系并卸载了该软件包,现在终于可以使用了!
答案 1 :(得分:-1)
似乎seleniumwebdriver不在正确的路径上。请检查Selenium Webdriver和支持dll是否在正确的路径上。
答案 2 :(得分:-1)
ArgumentException。详细信息:
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class ArgumentException : SystemException
FindElement()
方法仅接受单个参数,并定义如下:
IWebElement FindElement(
By by
)
Parameters:
by
Type: OpenQA.Selenium.By
The locating mechanism to use.
Return Value:
Type: IWebElement
The first matching IWebElement on the current context.
在代码试用中,您尝试向FindElement()
方法发送2个参数,如下所示:
if (driver.FindElement(By.Id("ember20"), timeout).Displayed)
因此您会看到 system.argumentexception
一种理想的方式是仅发送By
参数作为参数,如下所示:
if (driver.FindElement(By.Id("ember20")).Displayed)
但是,由于Id
属性 ember20
是通过NoSuchElementException和数字动态生成的,因此这行代码也将引发Ember.js部分将是动态的。
一种规范的方法是使用以下两种方法之一来寻找将WebDriverWait的ExpectedConditions引为ElementIsVisible()
的元素的可见性 {3}}:
CssSelector
:
IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("CssSelector_identifying_the_element_uniquely")));
XPath
:
IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("XPath_identifying_the_element_uniquely")));
确保:
您可以在以下位置找到相关的讨论