ElementNotInteractableException:元素不可交互 C# Nunit Selenium

问题描述 投票:0回答:3

我是 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 行

另请参阅附件

感谢您的帮助 异常

c# selenium css-selectors nunit webdriverwait
3个回答
0
投票

您的 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);

0
投票

改变

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 问题

由于 Ajax 请求,您的元素可能无法交互:

在点击之前也尝试一下:

public void WaitForAjax() { var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0")); }

更新4.

上面的定位器有可能不是唯一的(你检查过我提出的 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]")));



0
投票

解决方案:

更改元素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>

© www.soinside.com 2019 - 2024. All rights reserved.