在我的PageObject类中,IWebElement的定义如下:
[FindsBy(How = How.XPath, Using = "//input[contains(@ng-model,'model.BrancheName')]/following-sibling::span")]
private IWebElement TooltipBrancheName;
以下方法获取此工具提示的文本:
public string GetTooltiptekstDatabaseBranche()
{
string text = TooltipBrancheName.GetAttribute("class");
Actions actions = new Actions(driver);
actions.MoveToElement(TooltipBrancheName).Perform();
//actions.MoveToElement(driver.FindElement(By.XPath("//input[contains(@ng-model,'model.BrancheName')]/following-sibling::span"))).Perform();
return TooltipBrancheName.GetAttribute("title");
}
当我从测试类调用此方法时, System.Refelection.TargetException:Object与目标类型不匹配。使用MoveToElement方法抛出异常。
方法中的第一行代码仅用于检查ToolTipBrancheName IWebElement属性是否存在且不是Null,这是因为它为class属性提供了正确的值。
当我取消注释注释行并注释该行给出异常时,该方法正常工作。使用的定位器在两行中都是相同的。我很好奇是什么导致了这个异常,字段 ToolTipBrancheName 存在,不是Null并且类型正确 IWebElement 。
答案 0 :(得分:0)
在第二行尝试这个,也许它有效:
private IWebElement TooltipBrancheName {get; set;}
答案 1 :(得分:0)
一点历史:
昨天我在测试一个使用反射比较两个DTO的方法时遇到了同样的异常。我的问题是,我偶然使用了两个不同的DTO类(例如ServerDTO, AccountDTO
),当反射从第一个DTO获得属性时,它在第二个DTO中找不到它。
WILD猜测:
我要在这里采取远景并猜测你的FindsBy
返回的内容与WebDriver
返回的内容不同。如果您的驱动程序是(例如)ChromeDriver
,则返回ChromeWebElement
,但MAYBE,FindsBy(因为该属性与webdriver无关),返回IWebElement(它使用WebElement
接口)。
BUT
当您使用Actions actions = new Actions(driver);
时,它可能必须使用WebDriver的对象(ChromeWebElement
,FireFoxWebElement
,取决于您使用的驱动程序)。当Perform()
运行时,它使用反射来获取WebElement的属性(例外是一个死的赠品)。此时,也许它假设元素是ChromeWebElement
而不是IWebElement
,(因此例外,它会尝试获得ChromeWebElement
但不是{{1}的内容就像我偶然发现DTO一样。)
P.S。我上面所说的是纯粹的假设,但也许它可能是一个帮助进一步调查的打击。