【问题标题】:Selenium with .NET: invalid element state: Element is not currently interactable and may not be manipulatedSelenium with .NET:无效的元素状态:元素当前不可交互,可能无法操作
【发布时间】:2014-03-05 08:18:50
【问题描述】:

我正在尝试从 .这是 HTML 代码:

<select name="user_type" id="user_type" class="select">
<option value="0">Select</option>
<option value="1"> Admin </option>
<option value="1"> Agent </option>
<option value="1"> Butler </option>
<option value="1"> Ops </option>
</select>

这是我在 Selenium 中使用 .NET 实现的代码:

query_UserType = driver.FindElement(By.Id("user_type"));
driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 30));
query_UserType.Clear();
query_UserType.Click();
query_UserType.SendKeys(" Agent ");
string str_myEle2 = query_UserType.GetAttribute("value");
Console.WriteLine("New User Type is: " + str_myEle2);

它给出错误“无效的元素状态:元素当前不可交互并且可能无法操作”在线:

query_UserType.Clear();

我不知道如何解决这个问题。请帮忙。谢谢

【问题讨论】:

  • 您为什么要清除文本并将其插入到选择标签中?你到底想达到什么目标?
  • 实际上,我正在尝试从下拉列表中自动选择“代理”并点击“搜索”按钮,并且必须显示“代理”的结果。我尝试删除 query_UserType.Clear(),所以我不再收到异常,但我没有看到所需的结果,它只是单击“搜索”按钮,而没有在下拉菜单中实际将值设置为“代理”。不知何故,我想在下拉列表中设置值“代理”。
  • 对不起,这里的 HTML 代码是:

标签: .net selenium using


【解决方案1】:

Selenium .NET 库将select 元素的操作封装到一个名为SelectElement 的类中。你应该使用它而不是你正在做的方式。

所以引用WebDriver.Support.dll,为OpenQA.Selenium.Support.UI添加一个using:

using OpenQA.Selenium.Support.UI;

SelectElementIWebElement 作为参数,因此您有责任找到select 元素首先

IWebElement query_UserType = driver.FindElement(By.Id("user_type"));
var select = new SelectElement(query_UserType);

在这个类上有一个方便的方法,允许您通过它的 visible text 属性在 select 中选择一个 option

select.SelectByText("Agent");

同样,您正在尝试找出当前选择的选项。 SelectElement 类也可以轻松做到这一点:

IWebElement selectedOption = select.SelectedOption;

现在SelectedOption 将是一个IWebElement,表示当前在该select 中选择的option。所以要获得它的text 属性,它与其他元素没有什么不同:

selectedOption.Text;

总结起来就是:

driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 30));
IWebElement query_UserType = driver.FindElement(By.Id("user_type"));
var select = new SelectElement(query_UserType);
select.SelectByText("Agent");
IWebElement selectedOption = select.SelectedOption;
Console.WriteLine("Currently selected option is: {0}", selectedOption.Text);

【讨论】:

  • 在此行显示错误“元素不可见:元素当前不可见并且可能无法操作”:select.SelectByText("Agent");
  • 那么用户必须做什么才能使select可见?
  • :) 这就是我也很困惑的地方,我将如何让它可见。但它在浏览器中清晰可见。已经有另一个 CSS 添加到此“选择”中,可能是导致此冲突的原因..
  • id 为user_type 的元素不止一个吗?运行driver.FindElements(By.Id("user_type"));...它将返回一个集合,该集合中有多少项?
  • 不,实际上并没有多个user_type,但是“Admin”、“Agent”、“Ops”等选项在两个地方:首先在标签中,然后在
【解决方案2】:

就我而言,网页上有 2 个具有相同 ID 的元素。我通过使用find element by xpath 而不是find element by id 解决了这个问题。

【讨论】:

    【解决方案3】:

    如果此问题仅出现在 Chrome 浏览器中,请删除以下命令:

    query_UserType.Clear();
    

    我在使用 Chrome 时遇到了同样的问题,在删除 clear 命令后它已修复。

    如果您真的想从文本框中删除文本,请尝试使用机器人类或任何其他键盘模拟器,然后按“退格”/“删除”按钮。

    【讨论】:

      【解决方案4】:

      这个问题也发生在我身上。我遇到问题的sn-p代码是:

      nameProject.clear();        
      nameProject.click();
      

      其中 nameProject 是输入文本,如下所示:

      <input type="textbox" name="project" id="_pt_jobProperties_project">
      

      我将此输入文本映射如下:

      @FindBy(id = "_pt_jobProperties_project")
        private WebElement nameProject;
      

      我解决了它只是改变句子的顺序,如下所示:

      nameProject.clear();        
      nameProject.click();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        相关资源
        最近更新 更多