使用RAD Studio自动执行IHTMLElement OnKeyUp事件

时间:2018-07-17 04:56:43

标签: delphi internet-explorer dom automation c++builder

我正在尝试在下面概述的代码内触发OnKeyUp事件。因此,OnKeyUp事件将在我尝试自动执行的页面的HTML内触发一些javascript。

我正在研究一个使用RAD Studio XE6 C ++自动执行IE的项目。我有一个需要触发 OnKeyUp 事件的元素。但这不会触发javascript。

我要自动化的HTML代码是:

<input
   name="tbSearch"
   type="text"
   value="ZZZ"
   maxlength="10"
   id="tbSearch"
   class="smltxtbox txtlabel"
   ContentEditable="true"
   unselectable="off"
   OnBlur="Lookup(tbSearch,&#39;TC&#39;)"
   OnKeyUp="KeyUp(tbSearch, this)"
/>

到目前为止,我正在使用的代码是...

bool __fastcall SessionData::UpdateValueByIDTest(String id,String value) 
{
    IHTMLDocument3* htmldoc3;
    tagVARIANT keyup;
    HRESULT hresult;
    if (SUCCEEDED(ie->Document->QueryInterface(IID_IHTMLDocument3,(void**)&htmldoc3))) 
    {
        IHTMLElement* htmlElement;
        htmldoc3->getElementById(WideString(id).c_bstr(), &htmlElement);
        if (htmlElement)
        {
            //the value is updated OK
            htmlElement>setAttribute(WideString("value").c_bstr(),TVariant(value));
            hresult=htmlElement->get_onkeyup(&keyup);
            //expecting this to fire the OnKeyUp event, but it does not.
            hresult=htmlElement->put_onkeypress(keyup);
            return true;
        }
    }
    return false;
}

1 个答案:

答案 0 :(得分:0)

您只是将现有的OnKeyUp事件处理程序重新分配回OnKeyUp事件。您实际上根本没有触发该事件。

在IE11之前,请使用元素的IHTMLElement3::fireEvent()方法。

在IE11和更高版本中,您需要使用IEventTarget::dispatchEvent()方法。

尝试这样的事情:

#include <utilcls.h>

bool __fastcall SessionData::UpdateValueByIDTest(String id,String value) 
{
    TComInterface<IHTMLDocument3> htmldoc3 = ie->Document;
    if (htmldoc3)
    {
        TComInterface<IHTMLElement> htmlElement;
        if (SUCCEEDED(htmldoc3->getElementById(WideString(id).c_bstr(), &htmlElement)))
        {
            htmlElement->setAttribute(WideString(L"value").c_bstr(), TVariant(value));

            //fire the OnKeyUp event

            TComInterface<IDocumentEvent> documentEvent = htmldoc3;
            TComInterface<IEventTarget> eventTarget = htmlElement;

            if ((documentEvent) && (eventTarget))
            {
                TComInterface<IDOMEvent> eventObj;
                if (SUCCEEDED(documentEvent->createEvent(WideString(L"KeyboardEvent").c_bstr(), &eventObj)))
                {
                    TComInterface<IDOMKeyboardEvent> keybdEvent = eventObj;
                    keybdEvent->initKeyboardEvent(WideString(L"keyup").c_bstr(), VARIANT_TRUE, VARIANT_TRUE, NULL, WideString(L"<desired key>").c_bstr, DOM_KEY_LOCATION_STANDARD, WideString(L"<desired modifiers>").c_str(), VARIANT_FALSE, WideString(L"en-US").c_str());
                    // set other event properties as needed...

                    VARIANT_BOOL bPreventDefault = VARIANT_FALSE;
                    eventTarget->dispatchEvent(eventObj, &bPreventDefault);
                }
            }
            else
            {
                TComInterface<IHTMLDocument4> htmldoc4 = ie->Document;
                TComInterface<IHTMLElement3> htmlElement3 = htmlElement;
                if (htmldoc4 && htmlElement3)
                {
                    TVariant empty;
                    TComInterface<IHTMLEventObj> eventObj;
                    if (SUCCEEDED(htmldoc4->createEventObject(&empty, &eventObj)))
                    {
                        eventObj->put_keyCode(<desired key>);
                        // set other event properties as needed...

                        VARIANT_BOOL bCancelled = VARIANT_FALSE;
                        htmlElement3->fireEvent(WideString(L"onkeyup").c_bstr(), TVariant(eventObj), &bCancelled);
                    }
                }
            }

            return true;
        }
    }

    return false;
}