เหตุใด Selenium จึงสร้างอินสแตนซ์ใหม่ของ RC และ/หรือเบราว์เซอร์ระหว่างแต่ละรายการทดสอบ JUnit

เพิ่งเริ่มทดลองกับ Selenium 2.18 เหตุใด Selenium จึงสร้างอินสแตนซ์ใหม่ของ "การควบคุมระยะไกล" ระหว่างแต่ละรายการทดสอบ JUnit

ฉันสร้างการทดสอบหน่วยที่เรียกว่า testA, testB, testC และนี่คือสิ่งที่เกิดขึ้น:

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)

ดังนั้นคำถามของฉันคือเหตุใดฉันจึงไม่สามารถให้ Selenium มีอินสแตนซ์คงที่ของ "รีโมทคอนโทรล" เพียงอินสแตนซ์เดียวและยังมีอินสแตนซ์คงที่ของเว็บเบราว์เซอร์หนึ่งรายการตลอดทั้ง testA, testB และ testC

หมายเหตุ: ขั้นตอนที่ # 5 เกี่ยวข้องกับฉัน: หากขั้นตอนนั้นไม่เปลี่ยนเส้นทางไปยังไฟล์ในเครื่อง อาจเป็นไปได้ว่ารีโมทคอนโทรลในขั้นตอน # 4 อาจพบเนื้อหาในหน้านั้น สิ่งนี้เกิดขึ้นเพราะอินสแตนซ์ใหม่ของ "รีโมทคอนโทรล" ไม่ทราบเกี่ยวกับการมีอยู่ของเบราว์เซอร์ที่เริ่มต้นจากอินสแตนซ์แรกของ "รีโมทคอนโทรล" หรือไม่

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");
    }
     ...

และสำหรับลูกค้าของฉัน:

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 แหล่งที่มา


คำตอบ (4)


จะต้องมีลักษณะที่คุณกำลังสร้างอินสแตนซ์ของเซิร์ฟเวอร์ ลองเรียกใช้อินสแตนซ์เซิร์ฟเวอร์ของคุณด้วยพารามิเตอร์ -singleWindow

หากคุณกำลังเรียกใช้เซิร์ฟเวอร์โดยทางโปรแกรม ให้สรุปการเรียกใช้ในคำอธิบายประกอบ @Before

นี่คือตัวอย่าง:

@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
นั่นช่วยฉันได้มากจริงๆ ในการปรับปรุงการตั้งค่าและการรื้อถอน แต่ไม่ได้ตอบคำถามของฉันอย่างแน่นอน แต่ก็ขอบคุณสำหรับการตรัสรู้ :-) ตอนนี้ฉันใช้ @BeforeClass เพื่อตั้งค่าเซิร์ฟเวอร์ในคลาส Suite - person djangofan; 03.02.2012

เหตุใด Selenium จึงสร้างอินสแตนซ์ใหม่ของ "การควบคุมระยะไกล" ระหว่างแต่ละรายการทดสอบ JUnit

ฉันคิดว่านี่เป็นเพราะคุณกำลังบอกให้ คุณกำลังสร้างอ็อบเจ็กต์ซีลีเนียมของคุณในเมธอด setUp() พร้อมด้วยคำอธิบายประกอบ @Before jUnit สิ่งนี้จะบอก jUnit ให้รันเมธอดนั้นก่อนการทดสอบทุกครั้ง

เอกสาร JUnit API

person el roso    schedule 04.02.2012
comment
อ่า... ฉันคิดว่าคุณอาจจะพูดถูก ฉันจะลองสร้างวัตถุเบราว์เซอร์ในคลาสชุดโดยใช้คำอธิบายประกอบ @BeforeClass - person djangofan; 07.02.2012
comment
ลองดูสิ หากคุณต้องการรักษาเซสชันเบราว์เซอร์เดิมไว้ตลอดชุดการทดสอบ คุณต้องแน่ใจว่าคุณสร้างออบเจ็กต์ DefaultSelenium ใหม่เพียงครั้งเดียวเท่านั้น - person el roso; 08.02.2012

คุณช่วยกรุณาโพสต์ส่วนของรหัสของคุณเพื่อความชัดเจนได้ไหม? และแจ้งให้เราทราบหากคุณใช้ jUnit 4

ในการทดสอบหน่วยของฉัน ฉันมีเบราว์เซอร์ซีลีเนียมเพียงเบราว์เซอร์เดียว (หรือที่รู้จักในชื่อ Selenium Remote control) ที่ทำงานสำหรับกรณีทดสอบทั้งหมด

สำหรับกรณีทดสอบแต่ละกรณี คุณอาจต้องการใช้ฟังก์ชัน .open("the url") ฉันกำลังเริ่มต้นการควบคุมระยะไกลของซีลีเนียมในที่เดียวภายในฟังก์ชัน setUpBeforeClass() และปิดการควบคุมระยะไกลของซีลีเนียมใน TearDownAfterClass()

คำตอบของฉันขึ้นอยู่กับการเดาว่าคุณอาจทำอะไรผิด ฉันสามารถช่วยคุณได้มากขึ้นเมื่อฉันเห็นส่วนย่อยของโค้ด

person Watt    schedule 02.02.2012
comment
ใช่นี่คือปัญหา ดูเหมือนว่าฉันจำเป็นต้องใช้วิธี .open เมื่อเริ่มต้นกรณีทดสอบแต่ละกรณี ฉันไม่สามารถใช้อินสแตนซ์และเซสชันของเบราว์เซอร์ซ้ำจากการทดสอบครั้งก่อนได้ ฉันตั้งใจที่จะปล่อยให้การทดสอบแต่ละครั้งอยู่ที่ตำแหน่ง URL เพื่อเริ่มการทดสอบครั้งต่อไป ดังนั้นดูเหมือนว่าการต้องเปิดจะซ้ำซ้อนคุณว่าไหม? หากคุณใช้ open ฉันสงสัยว่าคุณใช้เบราว์เซอร์ตัวเดียวกันตลอดการทดสอบของคุณ - person djangofan; 04.02.2012

ในซีลีเนียม 2 จะไม่เป็นเช่นนั้นอีกต่อไป แต่ในเวอร์ชัน 1 เป็นกรณีนี้จริงๆ ฉันไม่พบวิธีแก้ปัญหาสำหรับสิ่งนี้

    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();
    }
}

ฉันเพิ่มเบ็ดการเริ่มต้นและการปิดระบบในกรณีที่ฉันต้องการล้างทรัพยากรเพิ่มเติมอื่นๆ

person Kurt Du Bois    schedule 02.02.2012
comment
ฉันใช้ Selenium 2 และยังคงมีปัญหานี้อยู่ - person djangofan; 02.02.2012
comment
คุณช่วยโพสต์วิธีเริ่มต้นรีโมตคอนโทรลได้ไหม? - person Kurt Du Bois; 02.02.2012
comment
สิ่งที่ฉันไม่เข้าใจคือคุณยังคงใช้ซีลีเนียมเซิร์ฟเวอร์ในซีลีเนียม 2 คุณสามารถใช้ webdriver, internetexplorerdriver/firefoxdriver/htmlunitdriver และคลาส defaultselenium ฉันจะโพสต์คำตอบว่าฉันใช้ซีลีเนียม 2 อย่างไร - person Kurt Du Bois; 03.02.2012
comment
ฉันลองแล้วและหลังจากการทดสอบแต่ละครั้ง WebDriver ปิดเบราว์เซอร์ จากนั้นการทดสอบถัดไปไม่มีตัวจัดการบนอินสแตนซ์ของเบราว์เซอร์อีกต่อไปเนื่องจากถูกปิด เหมือนกับว่า @Before เป็นสิ่งที่รันก่อนการทดสอบแต่ละครั้ง - person djangofan; 09.02.2012