Selenium Firefox 驱动程序中 WebElement 的 GetAttribute Returns 空
GetAttribute of WebElement in Selenium Firefox Driver Returns Empty
所以我编写了一个测试,测试运行并使用 Selenium
ChromeDriver
就好了。我的任务是让测试也在 FirefoxDriver
上运行。
我们在登录字段中输入文本的部分测试,然后检查登录字段以确保它已输入。我们查字段的方式是这样的
public virtual string Text => WebElement.GetAttribute("value");
while (!Text.Equals(inputText) && count++ < 3)
这在 Chrome
中工作得很好。但是它不在 Firefox
中。我调试测试的时候显示Text
是""
或者empty/blank。如果我打开 Firefox,我可以这样做 document.getElementById("login").value
并且它 returns 是正确的值。
WebElement.GetAttribute
在 FirefoxDriver
中的实现方式是否不同,还是我只是遗漏了什么?
很难说你的情况为什么在 Firefox
上不起作用,浏览器之间没有不同的实现。您可以尝试使用 IJavascriptExecutor
替代解决方案,如下所示:-
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string Text = (string)js.ExecuteScript("return arguments[0].value", WebElement);
获得 attribute/property 的 Selenium 协议已经随着 Selenium 3 的发展而发展。
对于 Selenium 2,方法 WebElement.GetAttribute(...)
returns HTMLElement
属性 存在时存在,否则为属性。
对于 Selenium 3,有一个独特的命令来获取 属性 和一个用于属性的命令:
https://www.w3.org/TR/webdriver/#get-element-property
在您的情况下,您似乎正在使用 geckodriver (Selenium 3),客户端仅限于 Selenium 2 规格。它可以解释为什么 属性 没有返回。
要使其正常工作,您可以将 C# 客户端升级到 V3.0.0-beta2:
https://github.com/SeleniumHQ/selenium/blob/master/dotnet/CHANGELOG
https://github.com/SeleniumHQ/selenium/commit/a573338f7f575ccb0069575700f2c059dc94c3b8
或者您可以在方法扩展中实现自己的 GetProperty
:
static string GetProperty(this IWebElement element, string property) {
var driver = (RemoteWebDriver)((RemoteWebElement)element).WrappedDriver;
var result = (IList)driver.ExecuteScript(@"
var element = arguments[0], property = arguments[1];
if (property in element) return [true, '' + element[property]];
return [false, 'Missing property: ' + property];
", element, property);
bool succeed = (bool)result[0];
if (!succeed) throw new WebDriverException((string)result[1]);
return (string)result[1];
}
用法:
string value = driver.FindElement(...).GetProperty("value");
所以我编写了一个测试,测试运行并使用 Selenium
ChromeDriver
就好了。我的任务是让测试也在 FirefoxDriver
上运行。
我们在登录字段中输入文本的部分测试,然后检查登录字段以确保它已输入。我们查字段的方式是这样的
public virtual string Text => WebElement.GetAttribute("value");
while (!Text.Equals(inputText) && count++ < 3)
这在 Chrome
中工作得很好。但是它不在 Firefox
中。我调试测试的时候显示Text
是""
或者empty/blank。如果我打开 Firefox,我可以这样做 document.getElementById("login").value
并且它 returns 是正确的值。
WebElement.GetAttribute
在 FirefoxDriver
中的实现方式是否不同,还是我只是遗漏了什么?
很难说你的情况为什么在 Firefox
上不起作用,浏览器之间没有不同的实现。您可以尝试使用 IJavascriptExecutor
替代解决方案,如下所示:-
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string Text = (string)js.ExecuteScript("return arguments[0].value", WebElement);
获得 attribute/property 的 Selenium 协议已经随着 Selenium 3 的发展而发展。
对于 Selenium 2,方法 WebElement.GetAttribute(...)
returns HTMLElement
属性 存在时存在,否则为属性。
对于 Selenium 3,有一个独特的命令来获取 属性 和一个用于属性的命令: https://www.w3.org/TR/webdriver/#get-element-property
在您的情况下,您似乎正在使用 geckodriver (Selenium 3),客户端仅限于 Selenium 2 规格。它可以解释为什么 属性 没有返回。
要使其正常工作,您可以将 C# 客户端升级到 V3.0.0-beta2: https://github.com/SeleniumHQ/selenium/blob/master/dotnet/CHANGELOG https://github.com/SeleniumHQ/selenium/commit/a573338f7f575ccb0069575700f2c059dc94c3b8
或者您可以在方法扩展中实现自己的 GetProperty
:
static string GetProperty(this IWebElement element, string property) {
var driver = (RemoteWebDriver)((RemoteWebElement)element).WrappedDriver;
var result = (IList)driver.ExecuteScript(@"
var element = arguments[0], property = arguments[1];
if (property in element) return [true, '' + element[property]];
return [false, 'Missing property: ' + property];
", element, property);
bool succeed = (bool)result[0];
if (!succeed) throw new WebDriverException((string)result[1]);
return (string)result[1];
}
用法:
string value = driver.FindElement(...).GetProperty("value");