تنفيذ عملية تحميل ملف من حاوية مع متصفح إلى إطار عمل اختباري

أتمتة اختبار نهاية - 2 - نهاية لنظام معلومات متكامل
الجزء 2-2. تنفيذ عملية تحميل ملف من حاوية باستخدام متصفح إلى إطار عمل اختباري. ابحث عن اسم الملف الذي تم تنزيله بواسطة المتصفح


المؤلف: habr.com/us/users/anrad
Hubs:
Tags: #autotest، #selenium، #selenoid، #headlessbrowser، #download


عندما كنا نطوّر اختبارات نهاية End-2-End لواجهة المستخدم ، واجهنا السؤال "كيفية الحصول على اسم آخر تحميل ملف المتصفح من WebDriver؟ "، لم تحصل Google على أي شيء بسرعة. لذلك ، كتبت هذه المقالة ، التي أخبرت في الوقت نفسه بالضبط ما لدينا مشكلة وكيف قمنا بحلها.

مع هذه المقالة ، نواصل سلسلة من المنشورات حول كيفية أتمتة عملية الاختبار اليدوي (المشار إليها فيما يلي باسم الاختبارات الذاتية) لنظام معلومات كبير (يشار إليه فيما يلي باسم الأنظمة) في أحد مشاريع LANIT الكبيرة وما جاء بها.

صورة
مصدر


المقالة نفسها تكمل الدورة ، فيما يلي رابط لجميع الأجزاء السابقة:
الجزء 1. التنظيمي والإداري. لماذا نحتاج إلى الأتمتة. تنظيم عملية التطوير والإدارة. تنظيم الاستخدام
الجزء 2. الفني. العمارة والمكدس التقني. تفاصيل التنفيذ والمفاجآت الفنية
الجزء 2-1. تطبيق الفئة الأساسية لجميع الاختبارات و JUnit RuleChain.

كان ذلك قبل عام. لذلك اليوم قد لا تكون ذات صلة. اكتب في التعليقات إذا كنت تعرف ما هي الطريقة الفعالة لمعالجة الملفات باستخدام خوادم شبكة الملف اللولبي المتعددة.

عند تطوير "الاختبارات التلقائية" ، كانت لدينا مهمة تنزيل (تنزيل) الملفات من النظام مع تحليل لاحق لمحتوياتها. لتحميل الملفات من النظام المختبر ، نستخدم الحلول التالية:
  • بالنسبة إلى وضع التشغيل "المحلي" (يتم تشغيله مباشرة على جهاز الكمبيوتر العامل) - عندما تتم تهيئة المتصفح "المحلي" ، يتم تمرير اسم المجلد المحلي المؤقت إليه كمعلمة. بعد ذلك ، تتم قراءة الملف مباشرة من المجلد المحلي لتحليله لاحقًا ؛
  • بالنسبة إلى الوضع "البعيد" (عبر Bamboo) - تم "أخذ" الملف من الحاوية مع المتصفح من خلال ميزة خادم الملف اللولبي: selenoid-host.example.com : 4444 / download / {SESSION_ID} / {FILE_NAME}


يتم وصف التفاصيل في الوثائق.

لكلا الوضعين ، للوصول إلى الملف ، كان عليك معرفة اسمه. كانت هذه مفاجأة. كانت مشكلة نقص البيانات حول اسم ملف "التنزيل" كما يلي:
  • بعد "النقر" على زر "تنزيل ملف" ، قام المتصفح بتنزيل الملف إلى المجلد المحلي المناسب في الحاوية ؛
  • في هذه الحالة ، تم تكوين اسم الملف ديناميكيًا ، ولم نتمكن من تحديده مسبقًا. كانت هذه ميزة لنظام الاختبار لدينا.
  • علاوة على ذلك ، يجب "سحب" هذا الملف من الحاوية ويجب إجراء التحقق التجاري من محتوياته ؛
  • من أجل "سحب" الملف ، يجب أن تعرف اسمه ، لكننا لم نعرف الاسم ، حيث تم إنشاء الاسم ديناميكيًا ولم يكن هناك قيمة في الرابط.


بالإضافة إلى ذلك ، تفاقم الوضع بسبب حقيقة أنه بسبب التعقيد الكبير لبعض الاختبارات ، يمكن تفريغ العديد من الملفات أثناء الاختبار كجزء من نصوص اختبار مستقلة مختلفة من تكوين الاختبار نفسه.
كان الحل الأفضل بالنسبة لنا هو الطريقة التي حددنا بها آخر ملف تم تنزيله. كانت هناك عدة طرق للقيام بذلك:
  • . . , ;
  • Google Chrome javascript chrome://downloads/, html-. .




يعد تحليل تكوين الملفات التي يتم تحميلها من المتصفح للوضع المحلي مهمة تافهة.
بالنسبة إلى الوضع البعيد ، تحتاج إلى استخدام ميزة "غير موثقة" للملف selenoid: selenoid-host.example.com : 4444 / download / {SESSION_ID} يعرض قائمة بجميع الملفات التي تم تنزيلها بنجاح ، حيث SESSION_ID هو معرّف جلسة ملف selenoid.
بشكل عام ، يعمل النظام بشكل جيد مع استثناء واحد: نحن تحتاج إلى الانتظار بعض الوقت حتى يتم تنزيل الملف ويظهر في القائمة. يمكن تعيين الانتظار خلال دورة المهلة ، ومع ذلك ، بهذه الطريقة لا يمكننا الحصول على معلومات حول خطأ محتمل في تحميل الملف. يمكننا فقط تحديد أن الملف لم يتم تحميله في هذه الدائرة. لذلك ، في النهاية ، استقرنا على طريقة تحديد اسم الملف من خلال chrome: // Downloads / page.

الحصول على اسم الملف من خلال chrome: // Downloads / page


تعمل هذه الطريقة بشكل جيد على حد سواء في الوضع المحلي والبعيد. مخطط العمل بسيط للغاية:
  • قم بتشغيل java script لفتح نافذة الكروم: // Downloads /؛
  • معالجة البيانات في النافذة بالطريقة المعتادة. انتظر حتى يتم تحميل الملف الأول في القائمة وحدد اسمه ؛
  • أغلق chrome: // Downloads / window وأعد اسم الملف الذي تبحث عنه.


لقد استخدمنا فكرة استخدام chrome: // Downloads / ، ولسوء الحظ ، لا يمكنني تقديم رابط للمصدر ، لأنه لم يتم حفظه بشكل خشن. فيما يلي التنفيذ الفعلي للفئة للحصول على اسم الملف.

فئة للحصول على اسم الملف الذي تم تنزيله عبر chrome: // Downloads /
	private static final long DOWNLOADS_PAGE_LOAD_TIMEOUT = 5_000;
	private static final long MAX_GET_FILE_NAME_ATTEMPT = 5;
 
	public static String getLastDownloadedFilename() throws DownloaderException {
        String[] filename = new String[1];
        Exception[] ex = new Exception[1];
        WebDriver driver = WebDriverRunner.getWebDriver();
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        Utils.driver.openNewTabCheckAndClose(
                () -> {
                    executor.executeScript("window.open('','_blank');");
                },
                () -> {
                    driver.get("chrome://downloads/");
 
                    for (int i = 0; i < MAX_GET_FILE_NAME_ATTEMPT; i++) {
                    	ex[0] = null;
                        sleep();
                    	try {
                        	WebElement element = (WebElement) executor.executeScript(
                                    "return document.querySelector('downloads-manager').shadowRoot.querySelector('downloads-item').shadowRoot.getElementById('file-link')");
                        	filename[0] = element.getText();
                            LOGGER.info("Attempt get file name " + i + ". Name = '" + filename[0] + "'");
                    	} catch (WebDriverException e) {
                        	ex[0] = e;
                            LOGGER.info("Failed attempt "+ i + " to get filename text: " + e.getMessage());
                        	continue;
                    	}
                    	if (filename[0] != null && !filename[0].isEmpty()) {
                        	 //             
                         	executor.executeScript(
                                    "document.querySelector('downloads-manager').shadowRoot.querySelector('downloads-item').shadowRoot.getElementById('remove').click()");
                        	break;
                    	}
                    }
                }
    	);
 
    	if (filename[0] != null && !filename[0].isEmpty()) {
            return filename[0];
    	}
 
    	String message = "Timeout. Can not get last downloaded file name from chrome://downloads/. File name is '" + filename[0] + "'. Exception: " + ex[0].getMessage();
        LOGGER.warning(message);
    	throw new DownloaderException(message, ex[0]);
	}

All Articles