无法将 HTMLInputElementClass 转换为具有 IE 自动化功能的 HTMLButtonElementC

本文关键字:自动化 IE 功能 HTMLButtonElementC HTMLInputElementClass 转换 | 更新日期: 2023-09-27 18:30:25

嗨,我正在尝试使用 C# 单击一个按钮,但我不断收到转换错误

Unable to cast COM object of type 'mshtml.HTMLInputElementClass' to class type 'mshtml.HTMLButtonElementClass' .表示 COM 组件的类型实例不能强制转换为表示 COM 组件的不同类型;但是,只要基础 COM 组件支持对接口的 IID 的查询接口调用,就可以将它们强制转换为接口。

我做错了什么?代码如下:

namespace IEAutomation {
    /// <summary>
    /// Summary description for IEDriverTest.
    /// </summary>
    /// 
    using mshtml;
    using System.Threading;
    using SHDocVw;
    public class IEDriverTest {
        public IEDriverTest() {
        }

        public void TestGoogle() {

            object o = null;
            SHDocVw.InternetExplorer ie = new
            SHDocVw.InternetExplorerClass();
            IWebBrowserApp wb = (IWebBrowserApp)ie;
            wb.Visible = true;
            //Do anything else with the window here that you wish
            wb.Navigate("https://adwords.google.co.uk/um/Logout", ref o, ref o, ref o, ref o);
            while (wb.Busy) { Thread.Sleep(100); }
            HTMLDocument document = ((HTMLDocument)wb.Document);
            IHTMLElement element = document.getElementById("Email");
            HTMLInputElementClass email = (HTMLInputElementClass)element;
            email.value = "testtestingtton@gmail.com";
            email = null;
            element = document.getElementById("Passwd");
            HTMLInputElementClass pass = (HTMLInputElementClass)element;
            pass.value = "pass";
            pass = null;
            element = document.getElementById("signIn");
            HTMLButtonElementClass subm = (HTMLButtonElementClass)element;//ERROR HERE
            subm.click();
        }
    }
}

无法将 HTMLInputElementClass 转换为具有 IE 自动化功能的 HTMLButtonElementC

<button>不是<input type="submit"><input type="button">

<input> DOM 元素由 mshtml.HTMLInputElementClass 表示,而<button> DOM 元素mshtml.HTMLButtonElementClass 表示。因此,强制转换是无效的,因为 ButtonElement 不可从 InputElement 分配(可转换),并且不同的类型表示两个不同的 HTML 实体。暴露了对 DOM 的"字面"解释。

强制转换不会(也不能)更改实际对象的类型。解决方案是处理对象的本质:mshtml.HTMLInputElement

(这是一件好事 HTMLInputElement 也有一个click

快乐编码。