ป้องกันไม่ให้ซีลีเนียมเปิดหน้าต่างใหม่

วันนี้ฉันใช้ Selenium เพื่อแยกวิเคราะห์ข้อมูลจากเว็บไซต์ นี่คือรหัสของฉัน:

    public ActionResult ParseData()
    {
        IWebDriver driver = new FirefoxDriver();
        driver.Navigate().GoToUrl(myURL);
        IList<IWebElement> nameList = driver.FindElements(By.XPath(myXPath));
        return View(nameList);
    }

ปัญหาคือเมื่อใดก็ตามที่มันทำงาน มันจะเปิดหน้าต่างใหม่ที่ตำแหน่ง myURL จากนั้นรับข้อมูล และเปิดหน้าต่างนั้นทิ้งไว้

ฉันไม่ต้องการให้ Selenium เปิดหน้าต่างใหม่ที่นี่ เพียงแค่เรียกใช้ที่พื้นหลังและให้ข้อมูลที่แยกวิเคราะห์มาให้ฉัน ฉันจะบรรลุเป้าหมายนั้นได้อย่างไร? โปรดช่วยฉันด้วย ขอบคุณมาก.


person Triet Doan    schedule 19.01.2014    source แหล่งที่มา
comment
การเปิดตัวไดรเวอร์ Selenium ภายในคำขอทางเว็บไม่ใช่ความคิดที่ดี IMHO ทำไมคุณไม่ดาวน์โหลดหน้านั้นที่ myURL โดยใช้ออบเจ็กต์ WebClient เป็นต้น จากนั้นจึงแยกข้อมูลที่ต้องการออกจากการตอบกลับ   -  person turdus-merula    schedule 19.01.2014


คำตอบ (2)


โดยทั่วไปฉันเห็นด้วยกับ Andrei: เหตุใดจึงใช้ Selenium หากคุณไม่ได้วางแผนที่จะโต้ตอบกับหน้าต่างเบราว์เซอร์ ต้องบอกว่าสิ่งที่ง่ายที่สุดที่ต้องทำเพื่อป้องกันไม่ให้ Selenium เปิดหน้าต่างทิ้งไว้คือการปิดก่อนที่จะออกจากฟังก์ชัน:

driver.Quit();

อีกทางเลือกหนึ่ง หากไม่จำเป็นต้องโหลดเพจใน Firefox ก็คือการใช้ ไดรเวอร์ HtmlUnit แทน (ไม่มี UI)

person user1433852    schedule 19.01.2014

ดูเหมือนว่าในแต่ละคำขอของเว็บที่คุณกำลังสร้าง (แต่ไม่ปิด / ทิ้ง) วัตถุไดรเวอร์ Selenium ดังที่ฉันได้กล่าวไว้ในความคิดเห็น อาจมีวิธีแก้ปัญหาที่ดีกว่าสำหรับปัญหาของคุณ...

ตามที่คุณต้องการ ดึงข้อมูล หน้าเว็บและ ดึงข้อมูล บางส่วนจากหน้าเว็บนั้น คุณสามารถใช้:

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

คำตอบสั้นๆ: ดึงข้อมูลด้วยวิธีอื่น Selenium มีไว้สำหรับ การทดสอบการสำรวจอัตโนมัติ เท่าที่ฉันรู้...

แต่...

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

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

person turdus-merula    schedule 19.01.2014
comment
ขอบคุณสำหรับคำตอบ. ดังนั้นฉันจึงใช้ Selenium ในพื้นหลังเช่น HtmlAgilityPack ไม่ได้ใช่ไหม - person Triet Doan; 19.01.2014
comment
@ Forte_201092 ... ฉันเดาว่าไม่ HtmlAgilityPack ดูเหมือนไลบรารี่เฉพาะสำหรับการจัดการกับ HTML ในอีกด้านหนึ่ง การใช้ซีลีเนียมหมายถึงการเริ่มต้น กระบวนการใหม่ (เบราว์เซอร์) การขับเคลื่อน ฯลฯ ไม่ใช่สิ่งที่ต้องทำภายในคำขอของเว็บ... ขออภัยหากไม่ได้ช่วย... - person turdus-merula; 20.01.2014