Selenium Firefox驱动程序中WebElement的GetAttribute返回空

Selenium Firefox驱动程序中WebElement的GetAttribute返回空,selenium,firefox,selenium-webdriver,selenium-firefoxdriver,getattribute,Selenium,Firefox,Selenium Webdriver,Selenium Firefoxdriver,Getattribute,因此,我编写了一个测试,该测试使用SeleniumChromeDriver运行并正常工作。我的任务是让FirefoxDriver的测试也能正常进行 测试的一部分是将文本输入到登录字段,然后检查登录字段以确保它是输入的。我们检查字段的方式是这样的 public virtual string Text => WebElement.GetAttribute("value"); while (!Text.Equals(inputText) && count++ < 3) 公

因此,我编写了一个测试,该测试使用
Selenium
ChromeDriver
运行并正常工作。我的任务是让FirefoxDriver的测试也能正常进行

测试的一部分是将文本输入到登录字段,然后检查登录字段以确保它是输入的。我们检查字段的方式是这样的

public virtual string Text => WebElement.GetAttribute("value");
while (!Text.Equals(inputText) && count++ < 3)
公共虚拟字符串文本=>WebElement.GetAttribute(“值”); 而(!Text.Equals(inputText)&&count++<3) 这在
Chrome
中非常有效。但是,它不在Firefox中。当我调试测试时,它显示
Text
或空/空。如果我打开Firefox,我可以这样做
document.getElementById(“login”).value
,它会返回正确的值


WebElement.GetAttribute在
FirefoxDriver
中的实现是否不同?或者我只是缺少了什么?

很难说为什么不在
Firefox上工作,浏览器之间的实现没有什么不同。您可以使用
IJavascriptExecutor
尝试替代解决方案,如下所示:-

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string Text = (string)js.ExecuteScript("return arguments[0].value", WebElement);

很难说你为什么不在Firefox上工作,浏览器之间没有不同的实现。您可以使用
IJavascriptExecutor
尝试替代解决方案,如下所示:-

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string Text = (string)js.ExecuteScript("return arguments[0].value", WebElement);

获取属性/属性的Selenium协议是随着Selenium 3而发展的

对于Selenium 2,方法
WebElement.GetAttribute(…)
在存在时返回
HTMLElement
属性,否则返回属性

对于Selenium 3,有一个独特的命令用于获取属性,另一个命令用于获取属性:

在您的案例中,您似乎正在使用geckodriver(Selenium 3),而客户端仅限于Selenium 2规范。这将解释为什么不归还财产

要使其正常工作,您可以将C#客户端升级到V3.0.0-beta2:

或者,您可以在方法扩展中实现自己的
GetProperty

静态字符串GetProperty(此IWebElement元素,字符串属性){
var driver=(RemoteWebDriver)((RemoteWebElement)元素).WrappedDriver;
var result=(IList)driver.ExecuteScript(@)
变量元素=参数[0],属性=参数[1];
if(元素中的属性)返回[true',+元素[property]];
返回[false,'缺少属性:'+property];
“、要素、财产);
bool success=(bool)结果[0];
如果(!success)抛出新的WebDriverException((字符串)结果[1]);
返回(字符串)结果[1];
}
用法:

string value=driver.FindElement(…).GetProperty(“value”);

获取属性/属性的Selenium协议随着Selenium 3的发展而发展

对于Selenium 2,方法
WebElement.GetAttribute(…)
在存在时返回
HTMLElement
属性,否则返回属性

对于Selenium 3,有一个独特的命令用于获取属性,另一个命令用于获取属性:

在您的案例中,您似乎正在使用geckodriver(Selenium 3),而客户端仅限于Selenium 2规范。这将解释为什么不归还财产

要使其正常工作,您可以将C#客户端升级到V3.0.0-beta2:

或者,您可以在方法扩展中实现自己的
GetProperty

静态字符串GetProperty(此IWebElement元素,字符串属性){
var driver=(RemoteWebDriver)((RemoteWebElement)元素).WrappedDriver;
var result=(IList)driver.ExecuteScript(@)
变量元素=参数[0],属性=参数[1];
if(元素中的属性)返回[true',+元素[property]];
返回[false,'缺少属性:'+property];
“、要素、财产);
bool success=(bool)结果[0];
如果(!success)抛出新的WebDriverException((字符串)结果[1]);
返回(字符串)结果[1];
}
用法:

string value=driver.FindElement(…).GetProperty(“value”);

这是有道理的。我使用的是geckodriver和Selenium 3.0 beta2,但Visual Studio一直告诉我GetProperty由于某些原因无效,我不得不在Saurabh Gaur的帖子中使用Javascript。这是有道理的。我使用的是geckodriver和Selenium 3.0 beta2,但Visual Studio一直告诉我GetProperty由于某些原因无效,我不得不求助于使用Saurabh Gaur文章中的Javascript。