我是 Selenium C# Nunit 的新手。 我运行了以下代码行
IWebElement SplitCase = driver.FindElement(By.XPath(".//*[@id='OpportunityPageV2UsrSplitCase503e4272-cdbd-44d2-98c2-e67a2996c717ComboBoxEdit-el']"));
SplitCase.Click();
IWebElement SplitCaseYes = driver.FindElement(By.CssSelector("li[data-item-marker=Yes]"));
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
SplitCaseYes.Click();
我收到以下消息: 信息: OpenQA.Selenium.ElementNotInteractableException:元素不可交互 (会话信息:chrome=89.0.4389.114) 堆栈跟踪: RemoteWebDriver.UnpackAndThrowOnError(响应错误响应) RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary
2 parameters) RemoteWebElement.Execute(String commandToExecute, Dictionary
2 个参数)
RemoteWebElement.Click()
TestClass1.CaseInfoTab() 第 151 行
然后我添加 10 秒的等待时间:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("li[data-item-marker=Yes]")));
我收到这条消息:
留言:
OpenQA.Selenium.WebDriverTimeoutException : Timed out after 10 seconds
堆栈跟踪: DefaultWait
1.ThrowTimeoutException(String exceptionMessage, Exception lastException) DefaultWait
1.Until[TResult](Func`2条件)
TestClass1.CaseInfoTab() 第 150 行
另请参阅附件
感谢您的帮助 异常
您的 css 选择器似乎是错误的。立即尝试。应该是
tagname[attributename='attributeval']
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("li[data-item-marker='Yes']")));
或者使用以下 xpath。
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//li[@data-item-marker='Yes' and text()='Yes']")));
更新:
尝试使用 Java 脚本执行器。
IWebElement SplitCaseYes = driver.FindElement(By.CssSelector("li[data-item-marker='Yes']"));
IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
executor.ExecuteScript("arguments[0].click();", SplitCaseYes);
改变
IWebElement SplitCase = driver.FindElement(By.XPath(".//*[@id='OpportunityPageV2UsrSplitCase503e4272-cdbd-44d2-98c2-e67a2996c717ComboBoxEdit-el']"));
到
IWebElement SplitCase = driver.FindElement(By.XPath("//div[contains(@id,'OpportunityPageV2UsrSplitCase')]"));
我不确定一开始是否有
div
。我在屏幕截图上没有看到它。验证一下。
您使用的定位器不稳定。
还添加显式等待。
尝试2:
对于
SplitCaseYes
也尝试使用此 css 选择器:By.CssSelector('li[data-item-marker="Yes"]')
或 ul>li[data-item-marker=Yes]
或它们的变体。
此外,在单击元素之前添加等待。
WebDriverWait wait = new WebDriverWait(PropertiesCollection.driver, TimeSpan.FromSeconds(30));
WebElement el = wait.until(ExpectedConditions.ElementToBeClickable(By.CssSelector("your selector")));
el.click();
由于 Ajax 请求,您的元素可能无法交互:
在点击之前也尝试一下:
public void WaitForAjax()
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
}
上面的定位器有可能不是唯一的(你检查过我提出的 CSS 定位器吗?)
尝试以下xpath
:
//div[contains(@data-item-marker,'Split Case')]/ul/li[@data-item-marker='Yes']
此定位器首先查看带有拆分大小写文本的
data-item-marker
,然后向下查看
ul
,最后查看第二个 li
元素。
在这种情况下,可以只使用 /li[@data-item-marker='Yes']
而不是
li[2]
在使用定位器执行任何代码之前,您应该检查它是否是唯一的。
更新5:
我发现 C# 的 Selenium ExpectedConditions 已过时: C# Selenium 'ExpectedConditions is obsolete'
尝试使用:SeleniumExtras.WaitHelpers.ExpectedConditions
。您需要使用 Nuget 包管理器导入它。这是例子:
var wait = new WebDriverWait(driver, TimeSpan.FromMilliseconds(10000));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.CssSelector("ul>li[data-item-marker=Yes]")));
更改元素ID后,我的问题解决了。
更多解释:使用以下 html 片段,命令
driver.FindElement(By.Id("btn1")).Click();
遇到错误:
<button type="button" id="btn1" style="display:none">first button with id "btn1"</button>
<button type="button" id="btn1" >second button with id "btn1"</button>
但是下面的html片段就不会有问题了:
<button type="button" id="btn0" style="display:none">button with id "btn0"</button>
<button type="button" id="btn1" >button with id "btn1"</button>