ความแตกต่างระหว่าง webdriver.Dispose (), .Close () และ .Quit ()


285

ความแตกต่างระหว่างสิ่งเหล่านี้คืออะไร

  1. Webdriver.Close()
  2. Webdriver.Quit()
  3. Webdriver.Dispose()

ต้องใช้อันไหนและเมื่อไหร่?


2
วิธี #dispose ดูเหมือนจะถูกลบอย่างเงียบ ๆ จาก WebDriver API ไม่พูดถึงในรายการเปลี่ยนแปลงการกล่าวถึงล่าสุดที่ฉันสามารถหาได้คือ v2.26 เอกสาร API ซึ่งฉันไม่สามารถหาลิงก์ได้อีก
jordanpg

ผมเห็นที่สับสนมาจากในคำตอบดังต่อไปนี้ ฉันคิดว่าคำถามนี้เดิมเป็นคำถาม C # เป็นวิธีการข้างต้น (ปิด, เลิกและกำจัด) เริ่มต้นด้วยตัวอักษรพิมพ์ใหญ่ (C #) ไม่ใช่อักษรตัวพิมพ์เล็ก (java) การกำจัดไม่ได้ถูกทิ้งจากการเชื่อมไคลเอ็นต์ C # WebDriver
rcasady616

การกำจัดเป็นรูปแบบ. Net และไม่มีการบันทึกไว้ในเอกสาร API ของซีลีเนียม ใน RemoteWebDriver, Quit call Dispose ซึ่งส่งคำสั่ง Quit (DELETE / session / {sessionId}) มีหลายที่ในฝั่งไคลเอ็นต์ที่คำสั่ง Quit ถูกสกัดกั้น ตัวอย่างการใช้งาน FirefoxDriver .net จริง ๆ แล้วจะทำการ process.Kill () โทรถ้ากระบวนการไม่ได้ปิดอย่างสง่างาม
Tamir Daniely

คำตอบ:


244

นี่เป็นคำถามที่ดีที่ฉันเห็นคนใช้ปิด () เมื่อพวกเขาไม่ควร ฉันดูในซอร์สโค้ดสำหรับลูกค้าซีลีเนียม & WebDriver C # Bindings และพบสิ่งต่อไปนี้

  1. webDriver.Close() - ปิดหน้าต่างเบราว์เซอร์ที่ไดรเวอร์มีโฟกัสอยู่
  2. webDriver.Quit() - โทรทิ้ง ()
  3. webDriver.Dispose() ปิดหน้าต่างเบราว์เซอร์ทั้งหมดจบลงได้อย่างปลอดภัยและเซสชั่น

รหัสด้านล่างจะกำจัดวัตถุไดรเวอร์สิ้นสุดเซสชันและปิดเบราว์เซอร์ทั้งหมดที่เปิดในระหว่างการทดสอบว่าการทดสอบล้มเหลวหรือผ่าน

public IWebDriver Driver;

[SetUp]
public void SetupTest()
{
    Driver = WebDriverFactory.GetDriver();
}

[TearDown]
public void TearDown()
{
    if (Driver != null)
      Driver.Quit();
}

โดยสรุปให้แน่ใจว่ามีการเรียก Quit () หรือ Dispose () ก่อนออกจากโปรแกรมและไม่ใช้วิธีการปิด () เว้นแต่คุณจะแน่ใจในสิ่งที่คุณทำ

หมายเหตุ
ผมพบว่าคำถามนี้เมื่อพยายามที่จะคิดออกว่าทำไมปัญหาที่เกี่ยวข้อง VM ของฉันกำลังวิ่งออกจากพื้นที่ harddrive ปรากฎว่ามีข้อยกเว้นทำให้ Quit () หรือ Dispose () ไม่ถูกเรียกทุกครั้งที่เรียกใช้ซึ่งทำให้โฟลเดอร์ appData เติมฮาร์ดไดรฟ์ ดังนั้นเราจึงได้ใช้ออกจาก () วิธีการอย่างถูกต้อง แต่รหัสไม่สามารถเข้าถึง สรุปตรวจสอบให้แน่ใจว่าพา ธ ของรหัสทั้งหมดจะล้างวัตถุที่ไม่มีการจัดการของคุณโดยใช้รูปแบบที่ปลอดภัยยกเว้นหรือใช้ IDisposable

นอกจากนี้
ในกรณีของ RemoteDriver การเรียก Quit () หรือ Dispose () จะปิดเซสชันในเซิร์ฟเวอร์ Selenium ด้วย หากเซสชั่นไม่ได้ปิดไฟล์บันทึกสำหรับเซสชันนั้นจะยังคงอยู่ในหน่วยความจำ


คุณอัปเดตข้อยกเว้นของคุณได้อย่างไร เพียงไปที่แต่ละรายการและเพิ่มการเลิก ()?
Mark Mayo

1
ในกรอบการทดสอบทำงานเช่น NUnit, JUnit คุณจะต้องตรวจสอบให้แน่ใจว่า Dispose () อยู่ใน TestTeardown () หรือ TestFixtureTeardown () ใน C # คุณสามารถใช้คำสั่ง "using" และ Dispose จะถูกเรียกเสมอหากมีการยกข้อยกเว้น คุณสามารถทำสิ่งที่คล้ายกันใน Java โดยใช้ลองจับในที่สุดและวางการกำจัดในที่สุด
rcasady616

1
@ rcasady616 นี้เป็นคำอธิบายที่ดีที่สุดที่ฉันได้มี ขอบคุณสำหรับมันและฉันคิดว่ามันคุ้มค่าสำหรับการ upvote
RNS

2
@ Mr.Bultitude ดีที่เข้าใจพิจารณามีคือไม่แตกต่างกัน ^^ ตามคำตอบนี้Quit()คือการเปลี่ยนเส้นทางไปDispose()
PixelMaster

1
@PixelMaster ใช่ถูกต้อง 100% โดยทั่วไปแล้วจะเป็นการเปลี่ยนเส้นทาง ไม่ใช่ผู้ที่เขียนรหัสใน Selenium ฉันสามารถเดาได้ว่าทำไมทั้งสองวิธีจึงมีอยู่ในการเชื่อมโยงไคลเอ็นต์ C # อาจเป็นไปได้ว่าพวกเขาต้องการใช้วิธีการทั่วไปสำหรับ "เลิก" ข้ามภาษาลูกค้า แต่ยังต้องการใช้ไดรเวอร์ในไวยากรณ์คำสั่ง "ใช้" (แม่มดจะต้องใช้วิธีการกำจัด () นั่นคือการคาดเดาที่ดีที่สุดของฉันไม่ว่าจะเป็นรหัสนั้นหรือจำเป็นต้องทำความสะอาด
rcasady616

47

Close() - มันถูกใช้เพื่อปิดเบราว์เซอร์หรือหน้าปัจจุบันซึ่งมีโฟกัส

Quit() - มันถูกใช้เพื่อปิดตัวลงเช่นไดรเวอร์เว็บหรือทำลายเช่นไดรเวอร์เว็บ (ปิดหน้าต่าง)

Dispose() - ฉันไม่ทราบวิธีนี้


3
หากคุณกำลังใช้การเชื่อมโยงภาษา. NET QuitและDisposeวิธีการควรเป็นคำพ้องความหมายซึ่งกันและกัน ในคำอื่น ๆโทรQuit Dispose
JimEvans

23

driver.closeและdriver.quitมีสองวิธีที่แตกต่างกันสำหรับการปิดเซสชันเบราว์เซอร์ใน Selenium WebDriver การทำความเข้าใจทั้งคู่และการรู้ว่าเมื่อใดควรใช้แต่ละวิธีเป็นสิ่งสำคัญในการทดสอบของคุณ ดังนั้นผมจึงได้พยายามที่จะหลั่งน้ำตาแสงบางอย่างเกี่ยวกับทั้งสองวิธีการเหล่านี้

driver.close- วิธีนี้จะปิดหน้าต่างเบราว์เซอร์ที่ตั้งโฟกัสไว้ แม้จะมีชื่อที่คุ้นเคยสำหรับวิธีการนี้WebDriverไม่ได้ใช้อินเตอร์เฟซAutoCloseable

driver.quit- วิธีการนี้โดยทั่วไปเรียกdriver.disposeวิธีการภายในตอนนี้ซึ่งจะปิดหน้าต่างเบราว์เซอร์ทั้งหมดและจบเซสชัน WebDriver อย่างงดงาม

driver.dispose- ดังกล่าวก่อนหน้านี้เป็นวิธีการภายในของ WebDriver ที่ได้รับการลดลงอย่างเงียบ ๆ ตามคำตอบอื่น - การตรวจสอบที่จำเป็น วิธีนี้ไม่มีกรณีการใช้งานในเวิร์กโฟลว์การทดสอบตามปกติเนื่องจากวิธีการก่อนหน้านี้ควรใช้กับกรณีการใช้งานส่วนใหญ่

กรณีการใช้คำอธิบาย: คุณควรใช้driver.quitเมื่อใดก็ตามที่คุณต้องการที่จะจบโปรแกรม มันจะปิดหน้าต่างเบราว์เซอร์ที่เปิดอยู่ทั้งหมดและยุติเซสชัน WebDriver หากคุณไม่ได้ใช้driver.quitเมื่อสิ้นสุดโปรแกรมเซสชัน WebDriver จะปิดอย่างไม่ถูกต้องและไฟล์จะไม่ถูกล้างออกจากหน่วยความจำ ซึ่งอาจส่งผลให้เกิดข้อผิดพลาดการรั่วไหลของหน่วยความจำ

คำอธิบายข้างต้นควรอธิบายความแตกต่างระหว่างdriver.closeและdriver.quitวิธีการใน WebDriver ฉันหวังว่าคุณพบว่ามีประโยชน์.

เว็บไซต์ต่อไปนี้มีเคล็ดลับที่ดีบางอย่างเกี่ยวกับการทดสอบซีลีเนียม: การเชื่อมโยง


ฉันยังสังเกตเห็นว่า IEDrivers ที่ใช้สำหรับการทำงานกับการทำงานอัตโนมัติตาม IE ไม่ได้ออกจากถ้าคุณใช้วิธี driver.close () ฉันต้องใช้ driver.quit () เพื่อยุติมัน เป็นเพราะเมธอดเลิกใช้ () ยังปรากฏขึ้นเพื่อล้างทรัพยากรที่ไม่เหมือน close () แม้ว่าในตัวอย่างของฉันฉันมีแท็บเดียวเสมอ
Pavan Dittakavi

14

quit(): ออกจากไดรเวอร์นี้โดยปิดทุกหน้าต่างที่เกี่ยวข้องที่เปิดอยู่

close() : ปิดหน้าต่างปัจจุบันออกจากเบราว์เซอร์หากเป็นหน้าต่างสุดท้ายที่เปิดอยู่


คำตอบนี้คิดถึงความแตกต่างที่สำคัญ: ออกจาก () จะหยุดบริการ webdriver พื้นฐานขณะที่ปิด () ไม่ได้ เคล็ดลับ: ไม่ต้องโทรปิด () ถ้ามีเพียงหน้าต่างเดียวที่เหลืออยู่
Corey Goldberg

5

ปิด (): - สมมติว่าคุณเปิดหน้าต่างเบราว์เซอร์หลายหน้าต่างพร้อมอินสแตนซ์ไดรเวอร์เดียวกันตอนนี้การเรียกปิด () บนอินสแตนซ์ของไดรเวอร์จะปิดหน้าต่างปัจจุบันที่มีการชี้ไปที่อินสแตนซ์ของไดรเวอร์ แต่อินสแตนซ์ของไดรเวอร์ยังคงอยู่ในหน่วยความจำและสามารถใช้เพื่อจัดการหน้าต่างเบราว์เซอร์ที่เปิดอยู่

ออกจาก (): - ถ้าคุณเรียกเลิก () ในอินสแตนซ์ของไดรเวอร์และมีหน้าต่างเบราว์เซอร์เปิดตั้งแต่หนึ่งหน้าต่างขึ้นไปมันจะปิดหน้าต่างเบราว์เซอร์ที่เปิดอยู่ทั้งหมดและอินสแตนซ์ของไดรเวอร์คือขยะที่เก็บรวบรวมเช่น ดังนั้นตอนนี้คุณไม่สามารถใช้อินสแตนซ์ของไดรเวอร์นี้เพื่อดำเนินการอื่นหลังจากเรียกเลิก () บนมัน ถ้าคุณทำมันจะโยนข้อยกเว้น

ทิ้ง (): - ฉันไม่คิดว่าจะมีวิธีการกำจัดสำหรับอินสแตนซ์ WebDriver

คุณสามารถไปที่ลิงค์ java doc ซีลีเนียมอย่างเป็นทางการนี้เพื่ออ้างอิง


"ฉันไม่คิดว่าจะมีวิธีกำจัดสำหรับอินสแตนซ์ WebDriver" แน่นอนว่ามี (อย่างน้อยใน C #)
EJoshuaS - คืนสิทธิ์ให้กับโมนิกา

5

ขึ้นอยู่กับปัญหา Github ของ PhantomJS การเลิก () ไม่ได้ยุติกระบวนการ PhantomJS คุณควรใช้:

import signal
driver = webdriver.PhantomJS(service_args=service_args)
# Do your work here

driver.service.process.send_signal(signal.SIGTERM)
driver.quit()

ลิงค์


5

ปิด ()เป็นคำสั่งที่ webdriver ซึ่งปิดหน้าต่างเบราว์เซอร์ซึ่งขณะนี้อยู่ในโฟกัส แม้จะมีชื่อที่คุ้นเคยสำหรับวิธีการนี้WebDriverไม่ได้ใช้อินเตอร์เฟซAutoCloseable

ในระหว่างกระบวนการอัตโนมัติหากมีมากกว่าหนึ่งหน้าต่างเบราว์เซอร์ที่เปิดอยู่คำสั่งปิด () จะปิดเฉพาะหน้าต่างเบราว์เซอร์ปัจจุบันที่กำลังโฟกัสในเวลานั้น หน้าต่างเบราว์เซอร์ที่เหลือจะไม่ถูกปิด รหัสต่อไปนี้สามารถใช้เพื่อปิดหน้าต่างเบราว์เซอร์ปัจจุบัน:

ออกจาก ()เป็นคำสั่ง webdriver ซึ่งเรียกวิธี driver.dispose ซึ่งจะปิดหน้าต่างเบราว์เซอร์ทั้งหมดและยุติเซสชัน WebDriver หากเราไม่ใช้เลิก () เมื่อสิ้นสุดโปรแกรมเซสชัน WebDriver จะไม่ถูกปิดอย่างถูกต้องและไฟล์จะไม่ถูกล้างออกจากหน่วยความจำ ซึ่งอาจส่งผลให้เกิดข้อผิดพลาดการรั่วไหลของหน่วยความจำ

หากกระบวนการทำงานอัตโนมัติเปิดเพียงหน้าต่างเบราว์เซอร์เดียวคำสั่งปิด () และเลิก () จะทำงานในลักษณะเดียวกัน ทั้งสองจะแตกต่างกันในฟังก์ชันการทำงานเมื่อมีหน้าต่างเบราว์เซอร์เปิดมากกว่าหนึ่งหน้าต่างในระหว่างการทำงานอัตโนมัติ

สำหรับ Ref ด้านบน: คลิกที่นี่

Dispose Command Dispose () ควรเรียก Quit () และมันจะปรากฏขึ้น อย่างไรก็ตามมันก็มีปัญหาเดียวกันกับที่การกระทำใด ๆ ที่ตามมาจะถูกบล็อกจนกว่า PhantomJS จะถูกปิดด้วยตนเอง

ลิงก์อ้างอิง


3

ความแตกต่างระหว่าง driver.close () และ driver.quit ()

driver.close - มันปิดหน้าต่างเบราว์เซอร์ที่ตั้งโฟกัสไว้

driver.quit - โดยทั่วไปจะเรียกวิธีการ driver.dispose ซึ่งจะปิดหน้าต่างเบราว์เซอร์ทั้งหมดและจบเซสชัน WebDriver อย่างสง่างาม


2

ซีลีเนียม WebDriver

  1. WebDriver.Close()วิธีนี้ใช้เพื่อปิดหน้าต่างที่เปิดอยู่ในปัจจุบัน มันปิดหน้าต่างที่เปิดอยู่ในปัจจุบันซึ่งคนขับมีสมาธิอยู่

  2. WebDriver.Quit()วิธีนี้ใช้เพื่อทำลายอินสแตนซ์ของ WebDriver มันปิดเบราว์เซอร์ Windows ทั้งหมดที่เกี่ยวข้องกับไดรเวอร์นั้นและสิ้นสุดเซสชันอย่างปลอดภัย การโทรของ WebDriver.Quit ()

  3. WebDriver.Dispose() วิธีนี้จะปิดหน้าต่างเบราว์เซอร์ทั้งหมดและจบเซสชันอย่างปลอดภัย


4
ถ้าคุณพูดอะไรที่คุณควรจะให้แหล่งที่มา
Meirion Hughes

2

ความเข้าใจของฉันdriver.close();จะปิดเบราว์เซอร์ปัจจุบันและdriver.quit();จะยุติเบราว์เซอร์ทั้งหมดที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.