Mengapa Selenium membuat instance RC dan/atau browser baru di antara setiap item pengujian JUnit?

Baru mulai bereksperimen dengan Selenium 2.18. Mengapa Selenium membuat instance baru "Remote Control" di antara setiap item pengujian JUnit?

Saya membuat beberapa unit test yang disebut testA, testB, testC dan inilah yang terjadi:

setUp:
0.  Create static instance of DefaultSelenium

testA:
1.  Selenium starts instance of "Remote Control"
2.  Selenium starts web browser an opens app

testB:
3.  Selenium starts new instance of "Remote Control"
4.  Selenium kills first instance of "Remote Control"
5.  Script sends existing browser to a URL on the local system (probably
    a temp file of some kind)

Jadi, pertanyaan saya adalah, mengapa saya tidak bisa membuat Selenium hanya memiliki satu instance konstan dari "Remote Control" dan juga satu instance konstan dari browser Web di seluruh testA, testB, dan testC?

CATATAN: langkah#5 mengkhawatirkan saya: jika langkah itu tidak mengalihkan ke file lokal, kemungkinan remote control pada langkah#4 menemukan konten di halaman. Apakah ini terjadi karena instance baru "Remote Control" tidak mengetahui keberadaan browser yang dimulai oleh "Remote Control" pertama?

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import org.openqa.selenium.server.RemoteControlConfiguration;
import org.openqa.selenium.server.SeleniumServer;

@RunWith(Suite.class)
@SuiteClasses({ Tests.class })

public class AllTests {

    static SeleniumServer seleniumserver;

    @BeforeClass
    public static void setUpClass() throws Exception {
        RemoteControlConfiguration settings = new RemoteControlConfiguration();
        settings.setTrustAllSSLCertificates(true);
        seleniumserver=new SeleniumServer(settings);
        seleniumserver.boot();
        seleniumserver.start();
        System.out.println("Finished suite setUpClass");
    }
     ...

Dan untuk klien saya:

public class Tests extends SeleneseTestBase {
private static DefaultSelenium selenium;

@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://localhost:8181/");
selenium.start();
}

public void testA() {  System.out.println("TestA");  }
public void testB() {  System.out.println("TestB");  }
public void testC() {  System.out.println("TestC");  }

person djangofan    schedule 02.02.2012    source sumber


Jawaban (4)


Itu harus menjadi cara Anda membuat instance server. Coba panggil server Anda dengan parameter -singleWindow.

Jika Anda memanggil server secara terprogram, rangkum pemanggilan tersebut dalam anotasi @Before.

Berikut ini contohnya:

@Before
public void startServer () throws Exception {
        RemoteControlConfiguration settings = new RemoteControlConfiguration();
        settings.setTrustAllSSLCertificates(true);
        SeleniumServer seleniumserver=new SeleniumServer(settings);
        seleniumserver.boot();
        seleniumserver.start();
...
}
person rs79    schedule 02.02.2012
comment
Itu benar-benar BANYAK membantu saya untuk meningkatkan pengaturan dan pembongkaran saya tetapi tidak menjawab pertanyaan saya dengan tepat. Terima kasih atas pencerahannya. :-) Sekarang saya menggunakan @BeforeClass untuk mengatur server di kelas Suite. - person djangofan; 03.02.2012

Mengapa Selenium membuat instance baru "Remote Control" di antara setiap item pengujian JUnit?

Saya pikir ini karena Anda yang menyuruhnya. Anda membuat objek Selenium dalam metode setUp() dengan anotasi @Before jUnit. Ini memberitahu junit untuk menjalankan metode tersebut sebelum setiap pengujian.

Dokumen JUnit API

person el roso    schedule 04.02.2012
comment
Ahh... Saya pikir Anda mungkin benar. Saya akan mencoba membuat objek browser di kelas suite menggunakan anotasi @BeforeClass. - person djangofan; 07.02.2012
comment
Cobalah, jika Anda ingin mempertahankan sesi browser yang sama melalui rangkaian pengujian, Anda perlu memastikan bahwa Anda hanya membuat objek DefaultSelenium baru satu kali. - person el roso; 08.02.2012

Bisakah Anda memposting potongan kode Anda untuk klarifikasi? Dan, beri tahu kami juga jika Anda menggunakan junit 4.

Dalam pengujian unit saya, saya hanya memiliki satu browser Selenium (alias Selenium Remote control) yang berjalan untuk semua kasus pengujian.

Untuk setiap kasus uji, Anda mungkin hanya ingin menggunakan fungsi .open("the url"). Saya menginisialisasi remote control Selenium hanya di satu tempat di dalam fungsi setUpBeforeClass() dan menutup remote control Selenium di teaDownAfterClass()

Jawaban saya didasarkan pada tebakan kesalahan apa yang mungkin Anda lakukan. Saya dapat membantu Anda lebih banyak lagi setelah saya melihat potongan kodenya.

person Watt    schedule 02.02.2012
comment
Ya, inilah masalahnya. Sepertinya saya diharuskan menggunakan metode .open di awal setiap test case. Saya tidak dapat menggunakan kembali instance dan sesi browser dari pengujian sebelumnya. Saya sengaja mencoba meninggalkan setiap tes di lokasi URL untuk memulai tes berikutnya. Jadi, sepertinya mengharuskan open itu mubazir, bukan? jika Anda menggunakan open maka saya ragu Anda menggunakan browser yang sama selama pengujian Anda. - person djangofan; 04.02.2012

Di Selenium 2 hal ini tidak lagi terjadi, tetapi di versi 1 memang demikian. Saya belum menemukan solusi untuk ini.

    private DefaultSelenium selenium;

private WebDriver driver;

@Before
public void setUp() throws Exception {
    startClient();
    startupHook();
}

protected abstract void startupHook() throws Exception;

private void startClient() {
    String sBrowserType = "*iexplore"; // For Firefox, use *firefox
    this.driver = new InternetExplorerDriver();
    selenium = new WebDriverBackedSelenium(driver, sBrowserType);
}

@After
public void tearDown() throws Exception {
    shutdownHook();
    stopClient();
}

protected abstract void shutdownHook() throws Exception;

private void stopClient() {
    if (selenium != null) {
        selenium.stop();
    }
}

Saya menambahkan kait startup dan shutdown jika saya perlu membersihkan sumber daya tambahan lainnya.

person Kurt Du Bois    schedule 02.02.2012
comment
Saya menggunakan Selenium 2 dan masih mengalami masalah ini. - person djangofan; 02.02.2012
comment
Bisakah Anda memposting cara Anda menginisialisasi remote control? - person Kurt Du Bois; 02.02.2012
comment
Yang tidak saya mengerti adalah Anda masih menggunakan server selenium di Selenium 2. Anda cukup menggunakan webdriver, internetexplorerdriver/firefoxdriver/htmlunitdriver dan kelas defaultselenium. Saya akan memposting jawaban tentang cara saya menggunakan Selenium 2. - person Kurt Du Bois; 03.02.2012
comment
Saya mencobanya dan setelah setiap pengujian, WebDriver menutup browser dan kemudian pengujian berikutnya tidak lagi menangani instance browser karena sudah ditutup. Seolah-olah @Before adalah sesuatu yang dijalankan sebelum setiap pengujian. - person djangofan; 09.02.2012