【问题标题】:ElementNotInteractableException : element not interactable C# Nunit SeleniumElementNotInteractableException : 元素不可交互 C# Nunit Selenium
【发布时间】:2021-04-19 04:25:49
【问题描述】:

我是 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, Dictionary2 parameters) RemoteWebElement.Execute(String commandToExecute, Dictionary2 参数) 远程WebElement.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

堆栈跟踪: DefaultWait1.ThrowTimeoutException(String exceptionMessage, Exception lastException) DefaultWait1.Until[TResult](Func`2 条件) TestClass1.CaseInfoTab() 第 150 行

请见附件

感谢您的帮助 不正常

【问题讨论】:

  • 欢迎来到 SO,您能澄清一下您要做什么以及出了什么问题吗?还有什么你已经尝试过修复它?
  • .//*[@id='OpportunityPageV2UsrSplitCase503e4272-cdbd-44d2-98c2-e67a2996c717ComboBoxEdit-el'] - 这就是问题所在。添加他的元素html代码
  • HI Vitallis,我相信问题出在这行代码上。 SplitCaseYes.Click();对于这个,我一直在接收消息; ElementNotInteractableException : 元素不可交互。 RemoteWebElement.Click()
  • 您能否在问题中添加尽可能多的数据:指向站点的链接(如果允许)、您执行的步骤以及您收到错误的代码行。拥有这些信息必须更准确地识别问题。

标签: c# selenium css-selectors nunit webdriverwait


【解决方案1】:

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

【讨论】:

  • 嗨 KunduK 我尝试使用您的代码行,并收到以下消息:消息:OpenQA.Selenium.WebDriverTimeoutException:10 秒后超时
  • @user15574820 :似乎元素在页面上不可见。尝试使用 JavaScript 执行器单击。尝试更新一个并告诉我。
  • KunduK--- 我确实尝试过使用 JavaScript,但没有运气。收到此消息:消息:OpenQA.Selenium.ElementNotInteractableException:元素不可交互(会话信息:chrome=89.0.4389.114)堆栈跟踪:RemoteWebDriver.UnpackAndThrowOnError(响应错误响应)RemoteWebDriver.Execute(字符串 driverCommandToExecute,Dictionary2 parameters) RemoteWebElement.Execute(String commandToExecute, Dictionary2 参数)RemoteWebElement .Click() TestClass1.CaseInfoTab() 第156行
【解决方案2】:

改变

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[2] 而不是/li[@data-item-marker='Yes']

在使用定位器执行任何代码之前,您应该检查它是否是唯一的。

更新 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]")));

【讨论】:

  • 嗨 Vitallis,我相信问题出在这行代码上。 SplitCaseYes.Click();对于这个,我收到了这条消息; ElementNotInteractableException : 元素不可交互。 RemoteWebElement.Click() –
  • 结果如何?
  • Vitallis-- 正如我所建议的那样,我确实尝试了以下代码: IWebElement SplitCaseYes = driver.FindElement( By.CssSelector("ul>li[data-item-marker='Yes']")); IJavaScriptExecutor 执行器 = (IJavaScriptExecutor) 驱动程序; executor.ExecuteScript("arguments[0].click();", SplitCaseYes); SplitCaseYes.Click();我得到了 OpenQA.Selenium.ElementNotInteractableException : element not interactable
  • 消息:OpenQA.Selenium.ElementNotInteractableException:元素不可交互(会话信息:chrome=89.0.4389.114)堆栈跟踪:RemoteWebDriver.UnpackAndThrowOnError(响应错误响应)RemoteWebDriver.Execute(字符串 driverCommandToExecute,Dictionary2 parameters) RemoteWebElement.Execute(String commandToExecute, Dictionary 2个参数)RemoteWebElement.Click()
  • 非常感谢您的支持??
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2020-03-08
  • 2021-12-16
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多