English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
عند استخدام selenium للتحكم الآلي، قد نواجه مواقف تحتاج إلى محاكاة عمليات الفأرة للاستمرار، مثل النقر، والنقر المزدوج، والنقر باستخدام الزر الأيمن للفأرة، والسحب وما إلى ذلك. وتقدم لنا selenium فئة لمعالجة هذا النوع من الحوادث - ActionChains
selenium.webdriver.common.action_chains.ActionChains(driver)
هذه الفئة تستطيع تلبية جميع احتياجاتنا المتعلقة بالعمليات الفعلية للفأرة.
1.استخدام ActionChains الأساسي
أولاً، يجب أن نفهم مبدأ تنفيذ ActionChains، عند استدعاء طريقة ActionChains، لن تنفذ على الفور، بل ستقوم بتخزين جميع العمليات في مجموعة بالترتيب، وعند استدعاء طريقة perform()، سيتم تنفيذ العمليات في المجموعة بالترتيب.
في هذه الحالة يمكننا أن نستخدم طريقتين من التشغيل:
•النصب المتسلسل
menu = driver.find_element_by_css_selector(".nav") hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1") ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
• الكتابة خطوة بخطوة
menu = driver.find_element_by_css_selector(".nav") hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1") actions = ActionChains(driver) actions.move_to_element(menu) actions.click(hidden_submenu) actions.perform()
كلا الطريقتين متشابهان في الأساس، ActionChains سينفذ جميع العمليات في ترتيبها.
2. قائمة طرق ActionChains
click(on_element=None) —— ضرب الماوس الأيسر مرة واحدة
click_and_hold(on_element=None) —— ضرب الماوس الأيسر وعدم الإطلاق
context_click(on_element=None) —— ضرب الماوس الأيمن
double_click(on_element=None) —— ضرب الماوس الأيسر مرتين
drag_and_drop(source, target) —— سحب إلى العنصر ثم إطلاق
drag_and_drop_by_offset(source, xoffset, yoffset) —— سحب إلى موقع معين ثم إطلاق
key_down(value, element=None) —— الضغط على مفتاح معين على لوحة المفاتيح
key_up(value, element=None) —— إطلاق مفتاح معين
move_by_offset(xoffset, yoffset) —— تحريك الماوس من الموقع الحالي إلى موقع معين
move_to_element(to_element) —— تحريك الماوس إلى العنصر
move_to_element_with_offset(to_element, xoffset, yoffset) —— تحريك إلى موقع على بعد مسافة معينة من العنصر (موقع الزاوية العلوية اليسرى)
perform() —— تنفيذ جميع الحركات في السلسلة
release(on_element=None) —— إطلاق زر الماوس الأيسر في موقع العنصر
send_keys(*keys_to_send) —— إرسال مفتاح إلى العنصر الحالي التركيز
send_keys_to_element(element, *keys_to_send) —— إرسال مفتاح معين إلى العنصر المحدد
سأستخدم أمثلة لشرح وتوضيح استخدام كل طريقة من الطرق المختلفة:
3. مثال على الكود
1. عمليات النقر
مثال على الرابط http://sahitest.com/demo/clicks.htm
代码:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Firefox() driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/clicks.htm') click_btn = driver.find_element_by_xpath('//input[@value="click me"]') # زر النقر doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # زر النقر المتكرر rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]') # زر النقر الأيمن ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # استخدام سلسلة print driver.find_element_by_name('t2').get_attribute('value') sleep(2) driver.quit()
النتيجة:
[CLICK][DOUBLE_CLICK][RIGHT_CLICK]
2. تحريك الفأرة
مثال على الرابط http://sahitest.com/demo/mouseover.htm
مثال على الكود:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Firefox() driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/mouseover.htm') write = driver.find_element_by_xpath('//input[@value="Write on hover"]') # الفأرة تمر عبر هذا العنصر، ويظهر "Mouse moved" في مربع الإدخال أدناه blank = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # الفأرة تمر عبر هذا العنصر، ويتم مسح محتوى مربع الإدخال أدناه result = driver.find_element_by_name('t1') action = ActionChains(driver) action.move_to_element(write).perform() # تحريك إلى write، عرض "Mouse moved" print result.get_attribute('value') # action.move_to_element(blank).perform() action.move_by_offset(10, 50).perform() # تحريك إلى النقطة البعيدة عن الموقع الحالي (10,50)، مشابهة للجملة السابقة، تحريك إلى blank، إزالة print result.get_attribute('value') action.move_to_element_with_offset(blank, 10, -40).perform() # تحريك إلى النقطة البعيدة عن العنصر blank (10,-40)، يمكن تحريك إلى write print result.get_attribute('value') sleep(2) driver.quit()
نتيجة
Mouse moved
Mouse moved
3. السحب
عنوان مثال http://sahitest.com/demo/dragDropMooTools.htm
代码:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Firefox() driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/dragDropMooTools.htm') dragger = driver.find_element_by_id('dragger') # العنصر المُسحب item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') # العنصر الهدف 1 item2 = driver.find_element_by_xpath('//div[text()="Item 2"]') # الهدف 2 item3 = driver.find_element_by_xpath('//div[text()="Item 3"]') # الهدف 3 item4 = driver.find_element_by_xpath('//div[text()="Item 4"]') # الهدف 4 action = ActionChains(driver) action.drag_and_drop(dragger, item1).perform() # 1. تحريك dragger إلى الهدف 1 sleep(2) action.click_and_hold(dragger).release(item2).perform() # 2. التأثير مشابه للجملة السابقة، ويمكنه أيضًا إحداث تأثير الحركة sleep(2) action.click_and_hold(dragger).move_to_element(item3).release().perform() # 3.效果与上两句相同,也能起到移动的效果 sleep(2) # action.drag_and_drop_by_offset(dragger, 400, 150).perform() # 4.移动到指定坐标 action.click_and_hold(dragger).move_by_offset(400, 150).release().perform() # 5.与上一句相同,移动到指定坐标 sleep(2) driver.quit()
النتيجة:
dropped dropped dropped dropped
一般用坐标定位很少,用上例中的方法1足够了,如果看源码,会发现方法2其实就是方法1中的drag_and_drop()的实现。注意:拖拽使用时注意加等待时间,有时会因为速度太快而失败。
4.按键
模拟按键有多种方法,能用win32api来实现,能用SendKeys来实现,也可以用selenium的WebElement对象的send_keys()方法来实现,这里ActionChains类也提供了几个模拟按键的方法。
示例网址http://sahitest.com/demo/keypress.htm
代码1:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Firefox() driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/keypress.htm') key_up_radio = driver.find_element_by_id('r1') # 监测按键升起 key_down_radio = driver.find_element_by_id('r2') # 监测按键按下 key_press_radio = driver.find_element_by_id('r3') # 监测按键按下升起 enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1] # 输入框 result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0] # 监测结果 # 监测key_down key_down_radio.click() ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform() print result.get_attribute('value') # 监测key_up key_up_radio.click() enter.click() ActionChains(driver).key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform() print result.get_attribute('value') # 监测key_press key_press_radio.click() enter.click() ActionChains(driver).send_keys('a').perform() print result.get_attribute('value') driver.quit()
النتيجة:
key downed charCode=[0] keyCode=[17] CTRL
key upped charCode=[0] keyCode=[16] NONE
key pressed charCode=[97] keyCode=[0] NONE
示例2:
示例网址http://sahitest.com/demo/label.htm
代码:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from time import sleep driver = webdriver.Firefox() driver.implicitly_wait(10) driver.maximize_window() driver.get('http://sahitest.com/demo/label.htm') input1 = driver.find_elements_by_tag_name('input')[3] input2 = driver.find_elements_by_tag_name('input')[4] action = ActionChains(driver) input1.click() action.send_keys('Test Keys').perform() action.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() # ctrl+a action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c action.key_down(Keys.CONTROL, input2).send_keys('v').key_up(Keys.CONTROL).perform() # ctrl+v print input1.get_attribute('value') print input2.get_attribute('value') driver.quit()
النتيجة:
Test Keys
Test Keys
يمكن أيضًا استخدام send_keys() من WebElement<input> للنسخ واللصق، يمكنكم تجربتها، يمكن أيضًا استخدام طريقة أكثر عمقًا مثل win32api التي هي أيضًا واحدة من طرق معالجة نافذة os، إذا كنتم مهتمين، يمكنكم أيضًا تجربة SendKeys و keybd_event
هذا هو محتوى المقال كله، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أيضًا أن تدعموا وتصفقوا لتعليم呐喊.
بيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق الطبع والنشر مملوكة للمالك الأصلي، محتويات الموقع تم إضافتها من قبل مستخدمي الإنترنت بشكل تلقائي، الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا اكتشفتم محتوى مخالف للحقوق الملكية، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال #بـ @) للإبلاغ، وتقديم الأدلة ذات الصلة، إذا تم التحقق من ذلك، سيتم حذف محتويات الاعتداء على حقوق الملكية فورًا.