فشل البرنامج الذي يستخدم السيلينيوم بعد البناء باستخدام cx_freeze
-
21-12-2019 - |
سؤال
أقوم بتطوير اختبار ويب تلقائي باستخدام السيلينيوم (الإصدار 2.37.2).يعمل البرنامج بشكل صحيح حتى أقوم بإجراء الاختبار الذي تم إنشاؤه باستخدام cxfreeze (يوجد أيضًا tkinter gui).
هناك وظيفة الحرف الأول
def initDriver(self):
if self.browser == FIREFOX:
profile = webdriver.FirefoxProfile(profile_directory=self.profile);
self._driver = webdriver.Firefox(firefox_profile=profile)
elif self.browser == CHROME:
self._driver = webdriver.Chrome(self.executable, chrome_options=profile)
elif self.browser == IEXPLORER:
self._driver = webdriver.Ie(self.executable)
الآن عندما أقوم بإنشائه باستخدام Cx_freeze أحصل على هذا الخطأ
تستدعي الطريقة redirectToBlank(...) initDriver(..) كأول شيء، فكيف أقوم بحزم ملف .xpi إلى ملف Library.zip - ما الخيار الذي يجب أن أستخدمه في setup.py؟وهل يجب عليّ أن أفعل ذلك؟
والشيء الغريب الثاني هو أن المتصفحات الأخرى تعمل بشكل جيد، فعندما أقوم بتشغيل ملف exe بالضغط على أيقونته، ولكن عندما أقوم بتشغيله من سطر الأوامر، تظهر لي أخطاء حتى بالنسبة لـ chrome وIE.(نأسف لعدم اكتمال التتبع)
جميع المسارات نسبية من الملف الذي تم تنفيذه (بغض النظر عن مكان تشغيله)،
شكرا لك على أي أفكار لحل هذه المشكلة.
(الطريقة redirectToBlank(...) تستدعي initDriver(..) كأول شيء)
المحلول
تم حل المشكلة الأولىإنها مشكلة مع فئة السيلينيوم - FirefoxProfile - التي تحاول تحميل webdriver.xpi كملف عادي، لكن السيلينيوم يحزم جميع المكتبات في ملف مضغوط، لذلك لا يستطيع السيلينيوم العثور عليه.حتى إجبار cx_freeze في ملف الإعداد على إضافة webdriver.xpi إلى الدليل المناسب في ملف مضغوط لن يساعد.
من الضروري تعديل فئة FirefoxProfile (في وحدة firefox_profile) على سبيل المثال مثل هذا
def _install_extension(self, addon, unpack=True):
"""
Installs addon from a filepath, url
or directory of addons in the profile.
- path: url, path to .xpi, or directory of addons
- unpack: whether to unpack unless specified otherwise in the install.rdf
"""
if addon == WEBDRIVER_EXT:
# altered lines
import sdi.env
WEBDRIVER_SUBSTITUTE = "path/to/unpacked/webdrive.xpi"
addon = os.path.join(os.path.dirname(__file__), WEBDRIVER_SUBSTITUTE)
# Original lines:
# addon = os.path.join(os.path.dirname(__file__), WEBDRIVER_EXT)
< the rest of the method >
العدد 2
OSError: win error 6: the handle is invalid
لم تكن المشكلة ناجمة عن cxfreeze أو السيلينيوم.أقوم بتشغيل ملف exe النهائي من git bash.هناك المشكلة.لسبب ما، لا يفتح git bash stdin للبرنامج ولهذا السبب يفشل.عندما أقوم بتشغيله في سطر أوامر Windows القياسي، يكون كل شيء على ما يرام أو إذا قمت بتشغيله من git bash مثل program.exe < empty_file
نصائح أخرى
ما فعلته هو إزالة قائمة حزم نماذج السيلينيوم.ووضعها في الداخل includefiles
, ، ثم يعمل.
مثله :
includefiles = [(seleniumPackage,'')]
...
options = {'build_exe': {'includes':includes,
'excludes':excludes,
'optimize':2,
'packages':packages,
'include_files':includefiles,
...