Cara mempercepat driver web 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();
    }
}

Hai teman,

Saya memiliki kode di atas dan berfungsi dengan baik serta mendapatkan data yang saya butuhkan. Satu-satunya masalah saya adalah: sangat lambat. Jika Anda melihat kode yang dia tempatkan di tempat yang sangat lambat, di situlah saya menemukan kesalahan: catch (NoSuchElementException ex) AND catch (ElementNotVisibleException envex)

butuh waktu lama untuk melakukan kesalahan agar bisa tertangkap. Adakah yang bisa membantu.


person Pankaj Srivastava    schedule 03.11.2015    source sumber
comment
Silakan baca panduan Bagaimana cara mengajukan pertanyaan yang baik, terutama bagian contoh Minimal, Lengkap, dan Dapat Diverifikasi ( MCVE). Ini akan membantu Anda memecahkan masalah Anda sendiri. Jika Anda melakukan ini dan masih mengalami kebuntuan, Anda dapat kembali dan memposting MCVE Anda, apa yang Anda coba, dan apa hasilnya sehingga kami dapat membantu Anda dengan lebih baik.   -  person JeffC    schedule 04.11.2015


Jawaban (1)


Itu karena .implicitlyWait() disetel pada 200an. Ketika sebuah elemen ditemukan dan tidak ditemukan, ia akan menunggu selama 200 detik. Saran saya adalah menghapus penantian implisit (dan Thread.sleep()s) dan menggantinya dengan penantian eksplisit menggunakan WebDriverWait dan 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();

Baca selengkapnya tentang penantian eksplisit dan implisit serta alasan Anda harus melakukannya jangan mencampurnya.

person JeffC    schedule 03.11.2015
comment
bagaimana jika saya menghapus seluruh pernyataan implisit? apakah itu akan membuat kode crash? - person Pankaj Srivastava; 04.11.2015
comment
Tidak, itu tidak akan membuat kode Anda mogok. Kemungkinan kodenya tidak berjalan sampai selesai karena ketinggalan menunggu sana-sini yang perlu ditambahkan. Namun itu akan berjalan jauh lebih cepat... - person JeffC; 04.11.2015
comment
jika saya tidak salah setiap kali saya memanggil driver.findElements, penantian implisit ini dipanggil.? jika demikian, apakah saya perlu meletakkan potongan kode itu sebelum setiap panggilan elemen find? - person Pankaj Srivastava; 04.11.2015
comment
Anda harus melihat dokumen, ini akan menjelaskan lebih lanjut tetapi ya... menyetel waktu tunggu implisit adalah untuk masa pakai instance driver sehingga hanya perlu dipanggil satu kali. Penantian eksplisit yang saya maksudkan dalam jawaban saya perlu dipanggil untuk setiap contoh Anda harus menunggu. Jika Anda ingin menunggu 10 detik untuk setiap elemen, Anda dapat menggunakan kembali wait yang saya nyatakan dalam kode di atas setiap saat. - person JeffC; 04.11.2015