كيفية النقر فوق زر على صفحة ويب ASP.NET برمجيا؟

أحاول معرفة كيفية النقر فوق زر في صفحة ويب برمجيًا.

على وجه التحديد ، لدي WinForm مع عنصر تحكم WebBrowser. بمجرد أن ينتقل إلى صفحة تسجيل الدخول ASP.NET المستهدفة أحاول العمل معها ، في معالج الأحداث DocumentCompleted لدي الكود التالي:

HtmlDocument doc = webBrowser1.Document;

HtmlElement userID = doc.GetElementById("userIDTextBox");
userID.InnerText = "user1";

HtmlElement password = doc.GetElementById("userPasswordTextBox");
password.InnerText = "password";

HtmlElement button = doc.GetElementById("logonButton");
button.RaiseEvent("onclick");

هذا يملأ مربعات النص المستخدم وكلمة المرور بشكل جيد ، لكنني لم أحقق أي نجاح في الحصول على هذا الزر المرتقب للنقر ؛ لقد حاولت أيضًا "النقر" و "انقر" و "onClick" - ماذا هناك أيضًا ؟. البحث عن msdn بالطبع لا يعطيني أية أدلة ، ولا groups.google.com. علي أن أكون قريبا أو ربما لا - قال لي شخص ما يجب أن أتصل بطريقة POST في الصفحة ، ولكن كيف يتم ذلك لم يكن جزءًا من النصيحة المقدمة.

راجع للشغل يتم ترميز الزر:

<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" />
0
وأضاف
الآراء: 2
إليك مرجع جيد لاستخدام عنصر تحكم WebBrowser (.NET 2.0) للتفاعل مع عناصر النموذج المختلفة.
وأضاف المؤلف Adam Neal, مصدر

8 إجابة

هل حاولت fireEvent بدلاً من RaiseEvent؟

0
وأضاف

قمت بنشر تعليق على غرار عدم الرغبة في استخدام نص جانبي للعميل على الإجابة عن Phunchak @. أعتقد أن ما تحاول القيام به مستحيل. الطريقة الوحيدة للتفاعل مع النموذج هي عن طريق برنامج نصي من جانب العميل. يمكن أن تتحكم C# code فقط في ما يحدث قبل إرسال الصفحة إلى المتصفح.

0
وأضاف

There is an example of how to submit the form using InvokeMember here. http://msdn.microsoft.com/en-us/library/ms171716.aspx

0
وأضاف

var btn = document.getElementById (btnName)؛ if (btn) btn.click ()؛

0
وأضاف
هذا أمر رائع إذا كان البرنامج النصي العميل بحاجة إليه ، ولكن ما أحاول القيام به هو جانب الخادم.
وأضاف المؤلف Cyberherbalist, مصدر

يمكنك محاولة استدعاء الأسلوب Page_ClientValidate() مباشرة من خلال clientscript بدلاً من النقر فوق الزر ، دعني أحفر مثالاً.

باستخدام MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");
0
وأضاف
قد يكون هذا مشكلة إذا كانت صفحة تسجيل الدخول تبحث بشكل خاص عن نقرة الزر
وأضاف المؤلف Jeff Martin, مصدر
صحيح جداً ، لقد فكرت في ذلك ولكن قررت أن أقوم بطرح طريقة الاستدعاء على أي حال.
وأضاف المؤلف Quintin Robinson, مصدر

يمكنك استدعاء الطريقة مباشرة وتمريرها في كائن عام ومعلمات EventArgs. بالطبع ، قد لا يعمل هذا إذا كنت تبحث في معلمات المرسل و EventArgs لبيانات محددة. كيف أتعامل مع هذا عادةً هو إعادة بناء أحشاء الأسلوب إلى طريقة doSomeAction() وسيقوم معالج الحدث للنقر بالزر ببساطة باستدعاء هذه الوظيفة. بهذه الطريقة لا أحتاج إلى معرفة كيفية استدعاء ما هو عادة معالج الأحداث فقط للقيام ببعض الشيء من المنطق على الصفحة/النموذج.

في حالة JavaScript بالنقر فوق زر لمشاركة نموذج ، يمكنك استدعاء form.submit() في البرنامج النصي لجانب العميل - والذي سيشغل أي برامج نصية للتحقق التي قمت بتعريفها في العلامة - ثم تحليل الحدث Form_Load والاستيلاء على قيمة النص من زر إرسال على هذا النموذج (على افتراض وجود واحد فقط) - على الأقل هذا هو طريقة ASP.NET 1.1 التي أنا مألوفة للغاية ... أي شخص يعرف شيئا أكثر أناقة مع 2.0+؟

0
وأضاف

كيف يعمل هذا؟ تناسبني

HtmlDocument doc = webBrowser1.Document;

doc.All["userIDTextBox"].SetAttribute("Value", "user1");
doc.All["userPasswordTextBox"].SetAttribute("Value", "Password!");
doc.All["logonButton"].InvokeMember("Click");
0
وأضاف

مجرد إضافية مفيدة إضافية حيث لم يتم إعطاء زر إرسال معرف - كما هو الحال في كثير من الأحيان.

    private HtmlElement GetInputElement(string name, HtmlDocument doc) {
            HtmlElementCollection elems = doc.GetElementsByTagName("input");

            foreach (HtmlElement elem in elems)
            {
                String nameStr = elem.GetAttribute("value");
                if (!String.IsNullOrEmpty (nameStr) && nameStr.Equals (name))
                {
                    return elem;
                }
            }
            return null;
    }

لذلك يمكنك الاتصال به على النحو التالي:

 GetInputElement("Login", webBrowser1.Document).InvokeMember("Click");

سيؤدي ذلك إلى ظهور استثناء إذا كان الإدخال "إدخال" مع القيمة "تسجيل الدخول" ، ولكن يمكنك تقسيمه إذا كنت تريد التحقق بشكل شرطي قبل استدعاء النقرة.

0
وأضاف
شعرت بشقا طفيفا وأعيد تنظيمه لقبول وثيقة التحكم بحيث تكون وظيفة عامة.
وأضاف المؤلف MonsCamus, مصدر