English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مثال على تنفيذ تنفيذ النقر التلقائي بعد تسجيل الدخول باستخدام python و selenium

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

أولاً، نحدد الطلب:   

  1. فتح صفحة الويب تلقائيًا   
  2. تسجيل الدخول إلى الحساب 
  3. نقر في منطقة ثابتة كل فترة من الزمن

لديني إثنين من الأفكار، sikuli أو python + selenium. يُفضل sikuli لسهولة العمليات المنطقية المباشرة، حيث يستخدم الصور كعلامات، لكنه يحتاج إلى نافذة ثابتة ولا يمكن تشغيله في الخلفية. selenium أكثر تعقيدًا قليلاً، ولكن سرعة الأداء عالية، يمكنه تغطية النافذة.

سأقوم بوصف مثال بسيط باستخدام Python + selenium.

الإصدار المستخدم هو Python3.3 وسelenium2، بيئة Windows (يدعم الآن 3.0 وما فوق، لم يتم تحديث العديد من المنتديات والمدونات).

أولاً، تثبيت البرنامج، Python لا تحتاج إلى شرح، تذكر تعيين متغير البيئة.

إليك كيفية تثبيت selenium، إذا تم تثبيت pip مسبقًا. قم بتشغيل الأمر التالي.

pip install -U selenium

طريقة أخرى،https://pypi.python.org/packages/source/s/selenium/selenium-2.52.0.tar.gzتحميل وتفريغ. يُذكر هنا نسخة Windows، في الواقع في Unix يشبهها كثيرًا، استخدم Wget لتحميل وتثبيت التثبيت.

استخدام الأمر (يستخدم setup عادةً لتركيب الوثائق الثالثة):

cd c:\Python3\xxxx
python setup.py install

安装过程中可能会出现ImportError: No module named setuptools,这是因为缺少setuptools模块,Python默认不安装。

http://pypi.python.org/pypi/setuptools上面提供了各系统的安装包和安装指南,对于Windows系统,下载https://bootstrap.pypa.io/ez_setup.py自动化安装脚本。

运行:

python ez_setup.py

完成后再安装selenium即可。

这里用我自己的实例简单的讲解一下流程。

第一步先完成打开浏览器。

selenium2结合了selenium和webdriver,直接引入各个浏览器相应的驱动,打开即可,注意chrome驱动可能需要另行安装。

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://www.xxx.com')

打开网页后需要登录,F12打开浏览器调试器,小箭头选择元素,查看登录框账号和密码的属性,一般都有ID。selenium可以通过以下各个方法获取元素并进行各种操作,具体解释请看上方链接文档:

  1. find_element_by_id
  2. find_element_by_name
  3. find_element_by_xpath
  4. find_element_by_link_text
  5. find_element_by_partial_link_text
  6. find_element_by_tag_name
  7. find_element_by_class_name
  8. find_element_by_css_selector

在其中id最为有效方便,优先考虑。选择完元素后可以通过WebDriver API调用模拟键盘的输入和鼠标的点击操作。代码如下:

username="qun" 
passwd="passwd"
browser = webdriver.Firefox()
browser.get('https://www.xxx.com')
browser.implicitly_wait(10)
elem=browser.find_element_by_id("loginFormUserName")
elem.send_keys(username)
elem=browser.find_element_by_id("loginFormPassword")
elem.send_keys(passwd)
elem=browser.find_element_by_id("loginFormSubmit")
elem.click()

عادة بعد تسجيل الدخول، سيقوم الصفحة بالقفز إلى صفحة جديدة، كيف يمكن الحصول على الصفحة الجديدة؟ هناك مفهوم من مفتاح النافذة، يتم إكمال التحويل من خلال مفتاح النافذة. ملاحظة! في بعض الأحيان، إذا كان العنصر في الإطار، فإنه يجب أيضًا استخدام switch. هنا يظهر دالة wait (مثلما كان في الأعلى)، لأنه يجب أن يستغرق وقتًا لتحميل الصفحة، وربما يتم تحميل العنصر بعد الضغط، وسأوضح ذلك في الدرس التالي.

browser.implicitly_wait(10)
browser.switch_to_window(browser.window_handles[-1])

بعد ذلك، يتم اختيار المنطقة التي يجب الضغط عليها، هنا يتم استخدام xpath للتحديد، لأنه في عملية الاختبار التلقائي، قد لا يمكن تحديد العنصر من خلال id أو name أو غيرها من الطرق (بعض الناس لا يكتبونها، يحبون table داخل table، لا أستطيع أن أفعل شيئًا)، يصبح xpath مفيدًا. الطريقة الشائعة للتمرير هي تثبيت plugin xpath في Firefox، وتحديدها باستخدام النقر بزر الماوس الأيمن. لن أتحدث عن ذلك، لأنني لا أستحب ذلك، لأن استخدام الإضافة سيجعل الكود مليئًا بهذه الأشياء:   

XPath(/html/body/div/div[3]/div[2]/div[4]/p[2])

إذا لم يكن هناك حاجة إلى ذلك، استخدم دائمًا خصائص العنصر لتحديد العنصر، مثل name للزر.

أو يمكن تحديد عن طريق العنصر الأب لتحديد العنصر الابن.

username =browser.find_element_by_xpath("//input[@name='username']")
clear_button = browser.find_element_by_xpath("//form[@id='loginForm']/input[4]")

كود كما يظهر، استخدام By الشائع على الإنترنت يتطلب إدخال حزمة.

من import selenium.webdriver.common.by import By

هنا يستخدم دالة أخرى، لا أعرف الفرق بينها - -.

for i in range(100):
  elem=WebDriverWait(browser, 30).until(
    lambda x:x.find_element_by_xpath("//table[@class='aaa']"/td[1]))
  elem.click()
  time.sleep(20)
  print ("click",i)

إذاً، يجب أن أذكر أيضًا وظيفة wait، في selenium2 يُقسم إنتظار التمثيل إلى نوعين، إنتظار التمثيل المحدد وإنتظار التمثيل التلقائي.  

إنتظار التمثيل المحدد

إنتظار التمثيل المحدد، وهو أن يتم انتظار ظهور العنصر أو أن يكون العنصر قابلاً للنقر وما إلى ذلك، إذا لم يتم العثور عليه، فسيستمر الإنتظار حتى أن يتم العثور عليه في الوقت المحدد، وإلا سيتم إطلاق الاستثناء.

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
  )

إنتظار التمثيل

لاحظ، يخبر إنتظار التمثيل جميع العناصر DOM عند البحث عن عنصر معين، إذا لم يتم العثور عليه على الفور، فإنه يحاول مرة أخرى لمدة هذه المدة.

browser.implicitly_wait(10) # seconds

الفرق بينهما هو أن الأول هو الذي يديره المستخدم مباشرة، والآخر يتم تحقيقه من قبل webdriver.

بالطبع يمكنك أيضًا استخدام طريقة الإنتظار حتى تنتهي. تذكر إدخال حزمة time.

time.sleep(20)

هذا مجرد عرض بسيط للطريقة، هناك العديد من الأماكن التي يمكن تحسينها، لم يتم تعبئة الدوال، ولم يتم استخدام تنفيذ متعدد الأسطر للتنفيذ المتوازي للعديد من البرامج. سيتم تحسين ذلك عند الحاجة.

هذا هو محتوى المقال كله، نأمل أن يكون قد ساعدكم في تعلم، ونأمل أيضًا أن تدعموا تعليمات النطق.

إعلان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المقال للملك الخاص به، تم جمع المحتوى من قبل المستخدمين على الإنترنت الذين قدموا مساهماتهم الخاصة وتم تحميلها بشكل تلقائي، لا يمتلك هذا الموقع حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا لاحظت أي محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وتقديم الدليل على ذلك، إذا تم التحقق من ذلك، فإن هذا الموقع سيرفع المحتوى المزعوم فورًا.

سيحبك