java افضل - كيفية التعامل مع حوار الطباعة في السيلينيوم؟




فيتامين الالماني (5)

لا بد لي من التعامل مع الحوار الطباعة (نفس الذي يظهر عند النقر على CTRL-P في المتصفح). لقد حاولت مع:

Alert printDialog = driver.switchTo().alert();
printDialog.dismiss();

لكنها لم تنجح. أيضا لم أتمكن من التقاط مقبض النافذة ، لأنه ليس نافذة ...

هل من الممكن التعامل مع هذه الأشياء وكيف؟


Answers

باستخدام Selenium و Facebook WebDriver مع Codeception ، واجهت نفس المشكلة - سينتهي تشغيل سيناريو الاختبار لأن مربع حوار الطباعة منع أي تفاعل مع الصفحة.

انتهى بي الأمر عدم فتح مربع حوار الطباعة في بيئة test (على سبيل المثال باستخدام Symfony و Twig):

{# Selenium can't interact with the OS native print dialog. #}
{# Therefore, it's disabled in the test environment. #}
{% if app.environment != 'test' %}
    $(document).ready(function () {
        var orderShouldBePrinted = window.location.href.indexOf(
            'print=true'
        ) !== -1;

        if (orderShouldBePrinted) {
            window.print();
        }
    });
{% endif %}

هذا لديه ميزة عدم إيقاف الاختبار. ومع ذلك ، لا يسمح باختبار ظهور مربع حوار الطباعة بالفعل.

كاختبار دخان ، أضفت $I->seeInCurrentUrl('print=true'); (لأن معلمة URL هذه تقوم بتشغيل window.print() ).


يمكنك ببساطة إغلاق المستعرض بعد ظهور مربع حوار الطباعة. من المسلم به أن هذا إجراء قاسٍ إلى حد ما ، لكن المزايا هي:

  • انها بسيطة
  • لا يتطلب أي أدوات خارجية
  • يعمل عبر أنظمة تشغيل ومتصفحات

اتصل وحسب:

myWebDriver.quit();

عادة ، يمكنك تشغيل الاختبار الخاص بك ، والتحقق من العناصر على الصفحة المراد طباعتها كالمعتاد. يمكن لـ WebDriver التحقق من عناصر الصفحة حتى إذا كان مربع حوار الطباعة مفتوحًا.

بمجرد الانتهاء من ذلك ، قم بإنهاء المتصفح (وأطلقه مرة أخرى للاختبار التالي).

لقد استخدمنا هذا بنجاح في مشروع. لجعل الأمور أكثر سهولة ، كتبنا فئة مجمّع يحتفظ بتتبع "مثيل WebDriver الحالي". لدي طرق لاسترداد هذا المثيل (إنشاء واحد كما هو مطلوب) وإغلاقه. بهذه الطريقة ، يمكنك دائمًا استدعاء getCurrentWebDriver() والحصول على نسخة صحيحة (تم إعادة استخدامها أو تم إنشاؤها حديثًا).


لسوء الحظ ، لا يمكن لـ WebDriver معالجة هذه (أو أي مستعرض آخر أو OS الحوار). علاوة على ذلك ، فإنها تميل إلى الظهور بشكل مختلف عبر المتصفحات / الأنظمة / إعدادات اللغة ، لذلك لا توجد إجابة محددة على الأرجح. ستحتاج إلى اكتشاف ومعالجة كل حالة ممكنة من أجل جعلها تعمل في كل مكان. تشمل خياراتك ما يلي:

  • فئة Robot ، تتيح لك "الضغط" برمجيًا على أي شيء على لوحة المفاتيح (أو النقر فوق بشكل أعمى) وبالتالي التخلص من مربع الحوار ، على سبيل المثال ، الضغط على Enter أو Esc . ومع ذلك ، كما ذكر أعلاه ، يعتمد أي تفاعل متقدم على نظام التشغيل / اللغة / الطابعة.

    // press Escape programatically - the print dialog must have focus, obviously
    Robot r = new Robot();
    r.keyPress(KeyEvent.VK_ESCAPE);
    r.keyRelease(KeyEvent.VK_ESCAPE);
    
  • AutoIt . إنه برنامج Windows مفيد للتعامل مع أي أتمتة على مستوى النظام. نفس الاعتماد على النحو الوارد أعلاه.

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


إجابة Slanec صحيحة - ليس لدى WebDriver إمكانيات محلية لهذا. طريقة حل هذه المشكلة في Windows هي مع كائن System.Windows.Forms.SendKeys:

    SendKeys.SendWait("^p");
    System.Threading.Thread.Sleep(500);
    SendKeys.SendWait("~");

    // give it a minute to spool onto the printer
    System.Threading.Thread.Sleep(5000);

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


جربت الحل التالي:

لقد قمت بإنشاء اختصار من javaw.exe من المسار C: \ Program Files \ Java \ jdk1.7.0_71 \ bin ولصقه في المسار C: \ ProgramData \ Oracle \ Java \ javapath .

بعد ذلك ، أطلقتُ Eclipse ، وعملت معي.





java selenium webdriver