شاطر
اذهب الى الأسفل
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

درس مترجم : طريقة الكتابة في صفحة الإنترنت والضغط على الأزرار من خلال برنامجك آليا

في الثلاثاء أكتوبر 09, 2012 9:34 am
في هذه المقالة أحاول أن أقدم امكانية لعمل autmate للمهام التي ننفذها باستخدام الماوس والكيبورد - لوحة المفاتيح- ، وهذا يمكن أن يعني : فتح الصفحة ، ادخال البيانات في صندوق نصوص مثلاً ومن ثم الضغط على زر ، ولاحقاً يمكن تطوير هذه المهام بحيث تشمل مهام أكثر تعقيداً تتضمن البحث في الويب وغير ذلك مما يمكن أن تستخدمها كأدوات لاختبار تطبيق الويب الخاص بك .
- توضيح : يقصد المؤلف انه سيحاول من خلال هذا البرنامج نقل البيانات من برنامج عادي إلى ويب ، مثلاً في حالة اضافة موضوع جديد في المنتدى فإنك تقوم بالضغط على رابط ، ثم كتابة بعض الكلمات ومن ثم الضغط على زر ، ويهدف الكاتب في هذه المقالة إلى عمل ذلك على برنامج خارجي يتولى هو لاحقاً القيام بهذه المهمات آلياً على صفحة الإنترنت .

وبشكل عام فإن الطريقة العامة لمعالجة البيانات تعتمد على مبدأ مثل هذا :
الكود:

 
//C#:
WebRequest req = WebRequest.Create("www.codeproject.com");
WebResponse res = req.GetResponse( );
'VB.net:
Dim req as WebRequest = WebRequest.Create("www.codeproject.com")
Dim res as WebResponse = req.GetResponse( )

حيث يتم لاحقاً عمل parsing (تقسيم وتحليل - لم أجد ترجمة مناسبة ولكنها باختصار العملية التي اقوم من خلالها بتقسيم كود HTML لاستطيع فهم جزء معين منه) لكود ال HTML ، ويتم ذلك من خلال البحث عن الأزرار ومربعات النص وخلافه ومعرفة اسماءها وأمكانها ، وبهذه الطريقة يمكنه انشاء زر أمر أو رابط يقوم من خلاله تنفيذ أوامر معينة .

أما نحن في هذه المقالة فنحاول الوصول إلى طريقة أخرى باستخدام الفئة Class المسمى باسم WebBrowser في .net وهو ما سينتج اختلافاً حيث أننا لا نتعامل مع Request-Respones مثلما سبق ، بل نتعامل مع ملفات نصية txt files من خلال أداة WebBrowser حيث نستطيع التعامل من خلال high level حيث تكون الأمورأسهل ، حيث لن نضطر لعمل كل العمليات السابقة بل سوف نتعامل مع مربعات النص textboxes والأزرار Buttons على أنها كائنات Objects بالشكل التالي :

الكود:

 
//C#:
Button btn = browser.ReturnElementByName(“myButton”);
btn.Click();
'VB.net:
Dim btn as Button = browser.ReturnElementByName(“myButton”)
btn.Click()

نبذة :

ال ActicX الخاص بـ WebBrowser هو في الواقع instance أو نسخة من متصفح الاكسبلورر الخاص بك يتمتع بكافة مميزاته ومشاكله أيضاً . وتتم جميع الاتصالات مع هذه الأداة من خلال مكتبة اسمها MSHTML والتي لديها واجهة Interface مع كل الأدوات التي يمكن تضمينها في صفحة الويب ، وهذه المكتبة موجودة في جميع اصدارات ويندوز .
ومبدئياً فإنك تستطيع قراءة الكائنات Objects وتحويلها إلى الواجهة التي تريدها ، ولكن هذا يكون صعباً إذا لم تكن تعرف الواجهة المراد التحويل إليها .

استخدام الكود :

طريقة فتح جديد :

الكود:

 
public string OpenPage(WebBrowser browser, string urlToLoad)
{
  browser.Navigate(urlToLoad);
}

*** لن أستمر في التحويل إلى VB.net ويمكنك مراجعة هذا الدرس لمزيد من التفاصيل :
http://arbtech.forumegypt.net/t13-topic

هناك نقطة هامة ينبه عليها الكاتب وهي ان عملية فتح صفحة هي عملية لاتزامنية asynchronous ولهذا لن تستطيع معرفة موعد انتهاء فتح الصفحة ، ولذا فإن الكود الخاص بنا لا بد أن ينتظر حتى يتم تحميل الصفحة بالكامل :

الكود:

public string OpenPage(WebBrowser browser, string urlToLoad){
  bool loadFinished = false;
 
  browser.DocumentCompleted += delegate { loadFinished = true; };
  browser.Navigate(urlToLoad);
 
  while (!loadFinished && counterTimeOut > 0){
    Thread.Sleep(100);
    Application.DoEvents();
    }
}
والآن ماذا حدث ؟ قمنا بربط حدث اتمام الصفحة بمتغير لا يتم تحويل قيمته إلا بعد الانتهاء من هذه العملية ، ولاحقاً نقوم بعمل Sleep متكرر للبرنامج حتى يتم الانتهاء الكلي من تحميل الصفحة .

طريقة الضغط على زر أمر Button :
نقوم اولاً بتحميل الصفحة في المتصفح ، ثانياً نقوم بمعرفة الزر باسمه من خلال WebBrowser.HtmlElementCollection وأخيراً نقوم بعمل Casting للزر باستخدام الواجهة الخاصة بـ MSHTML المسماه HTMLInputElementClass بالشكل التالي :

الكود:

 
HTMLInputElementClass iElement = (HTMLInputElementClass) button.DomElement;
iElement.click();
طريقة الضغط على رابط Link :
نفس الطريقة السابقة ما عدا اختلاف وجهة عملية ال Cast :
الكود:

HTMLAnchorElementClass linkElement =
  (HTMLAnchorElementClass) linkToClick.DomElement;
linkElement.click();
طريقة ادخال بيانات في مربع نص textBox :
كما اعتدنا سوف نقوم بأخذ مربع النص من HtmlElement ، ومن ثم نقوم باسناد خاصية نص له بالشكل التالي :
الكود:

element.InnerText = valueToFill;
طريقة الضغط على زر اختيار radioButton :

الكود:

HTMLInputElementClass iElement =
  (HTMLInputElementClass)radioToSelect.DomElement;
iElement.@checked = true;
ولاختيار عنصر من قائمة :
الكود:

HTMLSelectElementClass iElement =
  (HTMLSelectElementClass) dropdown.DomElement;
iElement.value = value;
ولحفظ صفحة الويب كصورة snapshot :
الكود:

 
Rectangle rec = new Rectangle();
rec.Offset(0, 0);
rec.Size = browser.Document.Window.Size;
Bitmap bmp = new Bitmap(rec.Width, rec.Height);
browser.DrawToBitmap(bmp, rec);
bmp.Save(“file.path”, ImageFormat.Jpeg);
في المثال المرفق هنا :
http://www.codeproject.com/cs/sample...owsing_src.zip
تجد رابط للسورس كود لجميع العمليات سابقة الذكر ، كما تجد هنا الرابط التنفيذي مباشرة :
http://www.codeproject.com/cs/sample...wsing_demo.zip
الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى