System.NotImplementedException:元素不再有效-Selenium Webdriver
这让我抓狂,我曾尝试使用System.NotImplementedException:元素不再有效-Selenium Webdriver,selenium,webdriver,selenium-webdriver,Selenium,Webdriver,Selenium Webdriver,这让我抓狂,我曾尝试使用By.Id或By.Xpath,但都不起作用,下面是我的Select方法尝试从Dropdownlist中选择文本 //测试代码 SelectMyText(By.XPath("//*[@id='ctl00_ContentPlaceHolder1_ddlCategory']"), "Employee"); //方法: public void SelectMyText(By locator, string valueToBeSelected) {
By.Id或By.Xpath
,但都不起作用,下面是我的Select方法
尝试从Dropdownlist中选择文本
//测试代码
SelectMyText(By.XPath("//*[@id='ctl00_ContentPlaceHolder1_ddlCategory']"), "Employee");
//方法:
public void SelectMyText(By locator, string valueToBeSelected)
{
var options = GetElementId(locator).FindElements(By.TagName("option"));
foreach (var option in options)
{
if (valueToBeSelected == option.Text)
{
option.Click();
return;
}
}
}
public IWebElement GetElementId(By locator)
{
return Driver.FindElement(locator);
}
以下是获取以下信息时出现的错误:
threw exception:
System.NotImplementedException: Element is no longer valid
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebElement.Execute(String commandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebElement.get_Text()
以下是此错误的屏幕截图:
好吧,您的问题来自“如何从下拉列表中选择选项”的问题类别。我通常使用两种方法: 方法1(使用actions builder,高级用户操作api): ); 你可以得到一些额外的信息 第二种方法(直接使用js):
String cssSelector =..blablabla...
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\'"+cssSelector+"\');");
stringBuilder.append("x.click();");
js.executeScript(stringBuilder.toString());
希望这对你们有用)好吧,你们的问题来自“如何从下拉列表中选择选项”的问题类别。我通常使用两种方法: 方法1(使用actions builder,高级用户操作api): ); 你可以得到一些额外的信息 第二种方法(直接使用js):
String cssSelector =..blablabla...
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\'"+cssSelector+"\');");
stringBuilder.append("x.click();");
js.executeScript(stringBuilder.toString());
希望这对你有用)这个想法很简单。当您怀疑该元素不可访问、不可见等时,您可以使用js来欺骗它) 下面我们有一些方法: -getText -单击元素 -getelementproperty
public void clickOnTheElement(String cssLocator){
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\'"+cssLocator+"\');");
stringBuilder.append("x.click();");
js.executeScript(stringBuilder.toString());
}
public String getTextOfTheElement(String cssLocator)
{ JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\""+cssLocator+"\");");
stringBuilder.append("return x.text().toString();") ;
String res= (String) js.executeScript(stringBuilder.toString());
return res;
}
//getElementProperty e.g. color
public String jsGetColor(String css){
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x=$(\'"+css+"\');");
stringBuilder.append("return x.css('color')");
String res= (String) js.executeScript(stringBuilder.toString());
return res;
}
//SO the only thing remains: you have to find css locator of the element you want to interact //with(get property, click on or get text) and pass it to appropriate function:
String myCssLocatorOfTheElement=..blablabla..;
String color=jsGetColor(myCssLocatorOfTheElement);
String text=getTextOfTheElement(myCssLocatorOfTheElement);
clickOnTheElement(myCssLocatorOfTheElement);
希望这对你有帮助)这个想法很简单。当您怀疑该元素不可访问、不可见等时,您可以使用js来欺骗它) 下面我们有一些方法: -getText -单击元素 -getelementproperty
public void clickOnTheElement(String cssLocator){
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\'"+cssLocator+"\');");
stringBuilder.append("x.click();");
js.executeScript(stringBuilder.toString());
}
public String getTextOfTheElement(String cssLocator)
{ JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\""+cssLocator+"\");");
stringBuilder.append("return x.text().toString();") ;
String res= (String) js.executeScript(stringBuilder.toString());
return res;
}
//getElementProperty e.g. color
public String jsGetColor(String css){
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x=$(\'"+css+"\');");
stringBuilder.append("return x.css('color')");
String res= (String) js.executeScript(stringBuilder.toString());
return res;
}
//SO the only thing remains: you have to find css locator of the element you want to interact //with(get property, click on or get text) and pass it to appropriate function:
String myCssLocatorOfTheElement=..blablabla..;
String color=jsGetColor(myCssLocatorOfTheElement);
String text=getTextOfTheElement(myCssLocatorOfTheElement);
clickOnTheElement(myCssLocatorOfTheElement);
希望这对您有所帮助)可能是因为浏览器重新组织了DOM。尝试在Try-catch中包装该代码,如果失败,则再次调用该代码。如果它在第二次运行,那么可能就是这种情况,您需要在测试中构建“稳定代码”,在最终放弃之前重试合理的次数。这可能是因为浏览器重新组织了DOM。尝试在Try-catch中包装该代码,如果失败,则再次调用该代码。如果它第二次起作用,那么可能就是这种情况,您需要在测试中构建“稳定代码”,在最终放弃之前重试合理的次数。哪种方法是最好的?更可靠吗?我最后查看了您的解决方案,但没有发现您是如何在.js代码中传递所选文本的?你能再详细说明一下吗?哪种方法最好?更可靠吗?我最后查看了您的解决方案,但没有发现您是如何在.js代码中传递所选文本的?你能再详细一点吗?