所以我编写了一个测试,测试运行并使用Selenium
ChromeDriver
就可以了。我的任务是让测试工作在FirefoxDriver
上。
部分测试我们将文本输入到登录字段,然后检查登录字段以确保输入。我们检查字段的方式就像这样
public virtual string Text => WebElement.GetAttribute("value");
while (!Text.Equals(inputText) && count++ < 3)
这在Chrome
中完全正常。但它不在Firefox
中。调试测试时,它显示Text
为""
或空/空。如果我打开Firefox,我可以执行此操作document.getElementById("login").value
并返回正确的值。
WebElement.GetAttribute
中FirefoxDriver
的实现方式是否有所不同?或者我错过了什么?
答案 0 :(得分:2)
在你的情况下很难说为什么不在Firefox
上工作,浏览器之间没有不同的实现方式。您可以使用IJavascriptExecutor
尝试替代解决方案,如下所示: -
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string Text = (string)js.ExecuteScript("return arguments[0].value", WebElement);
答案 1 :(得分:1)
获取属性/属性的Selenium协议已经与Selenium 3一起发展。
使用Selenium 2时,方法WebElement.GetAttribute(...)
会返回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");