วิธีทำให้ไดรเวอร์เว็บ Selenium chrome รวดเร็ว

@Before
public void setUpRestClient() throws InterruptedException {

    try {

        driver.manage().timeouts().implicitlyWait(200, TimeUnit.SECONDS);
        List<String> indexSuburbStatePost = new ArrayList<String>();

        indexSuburbStatePost.add("ABC");
        indexSuburbStatePost.add("YYZ");

        for (int j = 0; j < indexSuburbStatePost.size(); j++) {
            System.out.println("for loop===>"   + indexSuburbStatePost.get(j));


            mySchoolDriver(indexSuburbStatePost.get(j));

            Thread.sleep(10000);
            List<String> indexNumberSchool = new ArrayList<String>();
            List<String> indexNameSchool = new ArrayList<String>();

            List<WebElement> elementsAdv = driver.findElements(By.xpath("//table[@id='SearchResults']/tbody/tr/td"));
            System.out.println("Test advance elements number of elements: " + elementsAdv.size());

            writeToFile(indexSuburbStatePost.get(j));

            for (WebElement eleadv : elementsAdv) {

                System.out.println("Text adv======>" + eleadv.getText());
                if (eleadv.getText().equalsIgnoreCase("Primary")
                        || eleadv.getText().equalsIgnoreCase("Secondary")
                        || eleadv.getText().equalsIgnoreCase("Government")
                        || eleadv.getText().equalsIgnoreCase("Combined")
                        || eleadv.getText().equalsIgnoreCase("Special")
                        || eleadv.getText().equalsIgnoreCase(
                                "Non-government")) {

                } else {
                    indexNameSchool.add(eleadv.getText());
                }

            }

            Iterator<String> indexNumberSchoolIteratorAA = indexNameSchool
                    .iterator();

            for (int k = 0; k < indexNameSchool.size(); k++) {
                System.out.println("indexNumberSchoolIterator AA===>"+ indexNumberSchoolIteratorAA.next());
                writeToFile(indexNameSchool.get(k));

            }
            List<WebElement> elementscss = driver.findElements(By.cssSelector("#SearchResults tr a"));
            for (WebElement e : elementscss) {
                String url = e.getAttribute("href");
                System.out.println(url.substring(url.length() - 5));
                indexNumberSchool.add(url.substring(url.length() - 5));
            }

            for (int i = 0; i < indexNumberSchool.size(); i++) {
                Thread.sleep(10000);
                writeToFile(indexNumberSchool.get(i));

                try {
                    driver.findElement(By.xpath("//a[@href=\"/Home/Index/"+ indexNumberSchool.get(i) + "\"]")).click();
                    driver.findElement(By.id("IAccept")).click();
                    driver.findElement(By.className("captch-submit")).click();
                } catch (NoSuchElementException ex) {
                     do nothing, link is not present, assert is passed 
                    System.out.println(" NoSuchElementException======>" + ex.getMessage());

                    mySchoolDriver(indexSuburbStatePost.get(j));

                    Thread.sleep(10000);
                    driver.findElement(By.xpath("//a[@href=\"/Home/Index/"+ indexNumberSchool.get(i) + "\"]")).click();
                }
                driver.findElement(By.id("NaplanMenuButton")).click();
                try {
                    driver.findElement(By.xpath("//*[@id=\"NaplanMenu\"]/ul/li[2]/a")).click();
                } catch (ElementNotVisibleException envex) {
                    System.out.println(" ElementNotVisibleException======>"+ envex.getMessage());
                }

                List<WebElement> elements = driver.findElements(By.xpath("//div[@id='ResultsInNumbersContainer']/table/tbody/tr"));
                System.out.println("Test7 number of elements: " + elements.size());
                BufferedWriter writer = null;
                File f = null;
                for (WebElement ele : elements) {
                    if (ele.getAttribute("class").equalsIgnoreCase( "selected-school-row")) {
                            writeToFile(ele.getText());
                    }
                }
            }

        }

    } catch (Exception e) {
        e.printStackTrace();
        driver.close();
    }

}

private void mySchoolDriver(String indxSuburbPost) {
    driver.get("http://www.abc.xyz.com");
    driver.findElement(By.id("SuburbTownPostcodeSearch")).sendKeys(indxSuburbPost);
    driver.findElement(By.id("SuburbTownPostcodeSearchSubmit")).submit();
}

private void writeToFile(String indxSuburbPost) {
    try{


    String filename = "C:/logs/data.txt";
    FileWriter fw = new FileWriter(filename, true); 
    fw.write(indxSuburbPost + "\n");
    fw.write("\n");
    fw.close();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

สวัสดีเพื่อน,

ฉันมีโค้ดด้านบนและทำงานได้ดีและได้รับข้อมูลที่ฉันต้องการ ปัญหาเดียวของฉันคือ: มันช้ามาก หากคุณดูโค้ดที่เขาวางไว้ซึ่งช้ามากคือจุดที่ฉันกำลังทำข้อผิดพลาด: catch (NoSuchElementException ex) AND catch (ElementNotVisibleException envex)

ต้องใช้เวลานานกว่าจะผิดพลาดจึงจะถูกจับได้ ใครก็ได้โปรดช่วยด้วย


person Pankaj Srivastava    schedule 03.11.2015    source แหล่งที่มา
comment
โปรดอ่านคำแนะนำ ฉันจะถามคำถามที่ดีได้อย่างไร โดยเฉพาะส่วนที่เกี่ยวกับตัวอย่างขั้นต่ำ สมบูรณ์ และตรวจสอบได้ ( เอ็มซีวีอี) สิ่งนี้จะช่วยคุณแก้ปัญหาให้กับตัวคุณเอง หากคุณทำเช่นนี้แต่ยังติดขัดอยู่ คุณสามารถกลับมาโพสต์ MCVE ของคุณ สิ่งที่คุณลองแล้ว และผลลัพธ์เป็นอย่างไร เพื่อให้เราสามารถช่วยเหลือคุณได้ดียิ่งขึ้น   -  person JeffC    schedule 04.11.2015


คำตอบ (1)


เป็นเพราะ .implicitlyWait() ตั้งไว้ที่ 200 วินาที เมื่อระบุตำแหน่งองค์ประกอบแล้วไม่พบ องค์ประกอบนั้นจะรอเป็นเวลา 200 วินาที ข้อเสนอแนะของฉันคือการลบการรอโดยนัย (และ Thread.sleep()s) และแทนที่ด้วยการรอที่ชัดเจนโดยใช้ WebDriverWait และ ExpectedConditions.

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(...)).click();

// as long as you are OK with the time setting in the above WebDriverWait declaration
// (10 seconds), you can reuse the wait again and again with the same 10s wait.
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(...));
wait.until(ExpectedConditions.elementToBeClickable(...)).click();

อ่านเพิ่มเติมเกี่ยวกับการรออย่างชัดเจนและโดยปริยาย และเหตุผลที่คุณควร อย่าผสมพวกมัน

person JeffC    schedule 03.11.2015
comment
จะเกิดอะไรขึ้นถ้าฉันลบคำสั่งโดยนัยทั้งหมดออก? มันจะทำให้โค้ดพังหรือเปล่า? - person Pankaj Srivastava; 04.11.2015
comment
ไม่ มันจะไม่ทำให้โค้ดของคุณพัง อาจเป็นไปได้ว่าโค้ดจะไม่ทำงานจนเสร็จสมบูรณ์เนื่องจากคุณพลาดการรอที่นี่และที่นั่นซึ่งจะต้องเพิ่ม มันจะไปได้เร็วกว่ามาก... - person JeffC; 04.11.2015
comment
ถ้าฉันไม่ผิดทุกครั้งที่ฉันโทรหา driver.findElements การรอโดยนัยนี้จะถูกเรียก? หากเป็นกรณีนี้ ฉันจำเป็นต้องใส่โค้ดนั้นก่อนการเรียก find Element ทุกครั้งหรือไม่ - person Pankaj Srivastava; 04.11.2015
comment
คุณควรดูที่เอกสาร ซึ่งจะอธิบายเพิ่มเติม แต่ ใช่... การตั้งค่าการรอโดยนัยนั้นเป็นไปตลอดชีวิตของอินสแตนซ์ไดรเวอร์ ดังนั้นจึงจำเป็นต้องเรียกเพียงครั้งเดียวเท่านั้น การรอที่ชัดเจนที่ฉันอ้างถึงในคำตอบของฉันต้องถูกเรียกสำหรับแต่ละกรณีที่คุณต้องรอ หากคุณต้องการรอ 10 วินาทีสำหรับแต่ละองค์ประกอบ คุณสามารถใช้ wait ที่ฉันประกาศในโค้ดด้านบนซ้ำได้ทุกครั้ง - person JeffC; 04.11.2015