สลับสำหรับ thread.sleep(9000) ในทุกบรรทัดในซีลีเนียม

I have been using thread.sleep(9000) almost after every line of code in selenium which is making me wait for long.Can anybody suggest me an alternate way to reduce this.As my application is taking time load a page it needs to wait until a particular page is loaded to perform any action.

WebElement un = driver.findElement(By.id("login_username_id"));
            un.sendKeys(username);
            WebElement pwd = driver.findElement(By.id("login_password_id"));
            pwd.sendKeys(password);

            try {
                Thread.sleep(25000);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            driver.findElement(By.id("login_submit_id")).click();
            try {
                Thread.sleep(9000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

ฉันต้องการลดการใช้ thread.sleep หลังจากทุกบรรทัด และใช้ฟังก์ชันทั่วไปหนึ่งฟังก์ชันเพื่อรอเมื่อจำเป็น


person Vdev    schedule 25.05.2016    source แหล่งที่มา


คำตอบ (3)


ใช้ตัวอย่างด้านล่าง:

public class Main{

static WebDriver driver = new FirefoxDriver();

public static void main(String [] args) throws InterruptedException{

    WebElement un = driver.findElement(By.id("login_username_id"));
    un.sendKeys(username);
    WebElement pwd = driver.findElement(By.id("login_password_id"));
    pwd.sendKeys(password);

    waitForElement(By.id("ur id"),60);

    driver.findElement(By.id("login_submit_id")).click();

    waitForElement(By.id("ur id"),60);


}

/**
 * wait until expected element is visible
 *
 * @param   expectedElement     element to be expected
 * @param   timeout             Maximum timeout time
 */
public static void waitForElement(By expectedElement, int timeout) {
    try {
        WebDriverWait wait = new WebDriverWait(driver, timeout);
        wait.until(ExpectedConditions.visibilityOfElementLocated(expectedElement));

    } catch (Exception e) {
        e.printStackTrace();
        //System.out.println("print ur message here");
    }
}
}

หากคุณมีความสับสนใด ๆ โปรดแจ้งให้เราทราบ

person noor    schedule 25.05.2016
comment
ฉันควรพูดถึงองค์ประกอบที่ไหน ฉันหมายถึงบรรทัดไหน และคุณช่วยยกตัวอย่างให้ฉันได้ไหม เป็นแบบนี้ไหม บอกว่าถ้าฉันต้องการรอหลังจากคำสั่งนี้ฉันควรเขียนอย่างไร? driver.findElement(By.id(login_submit_id)).คลิก(); - person Vdev; 25.05.2016
comment
ใช้วิธีการเช่น : waitForElement(By.id(login_submit_id) , 60); - person noor; 25.05.2016
comment
คุณยังสามารถใช้ By.cssSelector หรือ By.class .... ซึ่งจะรอสูงสุด 60 วินาที...แต่หากพบองค์ประกอบหลังจาก 1 วินาที การรอจะเสร็จสิ้น - person noor; 25.05.2016
comment
เหมือนที่ฉันมีรหัสของฉันด้วยวิธีนี้ .. คุณสามารถเพิ่มรหัสของคุณและส่ง public static void main(String[] args) ให้ฉันได้ไหม InterruptedException { WebDriver driver=new FirefoxDriver();WebElement un = driver.findElement(By.id(login_username_id) )); un.sendKeys (ชื่อผู้ใช้); WebElement pwd = driver.findElement(By.id(login_password_id)); pwd.sendKeys(รหัสผ่าน);/*ลอง { Thread.sleep(25000); } catch (InterruptedException e1) { // TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ e1.printStackTrace(); }*/ driver.findElement(By.id(login_submit_id)).คลิก(); - person Vdev; 25.05.2016
comment
ฉันได้ให้ตัวอย่างชั้นเรียนเต็มรูปแบบในโค้ดที่อัปเดตของฉัน คัดลอกและนำเข้าแพ็คเกจที่จำเป็นแล้วรัน - person noor; 25.05.2016
comment
และหลังจากคำสั่งใดที่ฉันควรใช้วิธีนี้ public static void waitForElement(By ExpectElement, int timeout)......like หลังจากนี้?WebDriver driver=new FirefoxDriver(); - person Vdev; 25.05.2016
comment
ให้เราสนทนาต่อในการแชท - person noor; 25.05.2016
comment
โอเคไหม ... @Vdev? - person noor; 26.05.2016
comment
สวัสดีนูร์ ฉันต้องการคำแนะนำจากคุณเกี่ยวกับสิ่งหนึ่ง ฉันได้ใช้เฟรมเวิร์กที่ขับเคลื่อนด้วยข้อมูลและเขียนสคริปต์บางส่วน ฉันจะทำอะไรต่อไปได้ และคุณจะตัดสินได้อย่างไรว่าโค้ดของฉันดีพอตามมาตรฐาน - person Vdev; 14.06.2016
comment
@Vdev จริง ๆ แล้วฉันคิดว่านั่นเป็นคำถามอื่น .... ก่อนอื่นคุณต้องยอมรับคำตอบหากคำตอบช่วยคุณได้และเกินกว่าที่คุณจะถามคำถามอื่นพร้อมรายละเอียดสำหรับวิธีแก้ไขได้ stackoverflow ไม่ชอบการแชทที่ยาวเกินไป - person noor; 14.06.2016

สวัสดี โปรดใช้การรอสากลในสคริปต์ของคุณ เช่น การรอโดยนัย

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

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

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

WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.until(ExpectedConditions.visibilityOfElementLocated(your element));
person eduliant    schedule 25.05.2016
comment
ฉันใช้คำสั่งนี้ แต่จะเกิดอะไรขึ้นหากฉันต้องการรอหลังจากทุกคำสั่ง ฉันควรใช้มันอย่างไร สมมติว่าองค์ประกอบของฉันเป็นเช่นนั้น (By.id(login_password_id)); - person Vdev; 25.05.2016
comment
ในกรณีนั้นให้ใช้การรอแบบสากลในขณะที่สร้างเบราว์เซอร์ เช่น WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - person eduliant; 25.05.2016
comment
แต่ driver.manage ไม่ได้ช่วยอะไร ,,,คาดว่า thread.sleep หลังจากทุกบรรทัด - person Vdev; 25.05.2016
comment
โปรดเพิ่มเวลาของไดรเวอร์จัดการเป็น 50 วินาทีดูว่าจะช่วยได้หรือไม่ - person eduliant; 25.05.2016
comment
ไม่ มันไม่ได้ช่วยอะไร ฉันต้องเขียนบางอย่างที่เหมือนกันเพื่อหลีกเลี่ยงสิ่งนี้ ฉันได้รับข้อผิดพลาดนี้ ข้อยกเว้นในเธรด main org.openqa.selenium.WebDriverException: องค์ประกอบไม่สามารถคลิกได้ที่จุด (858, 409.933349609375) องค์ประกอบอื่นๆ จะได้รับการคลิก: ‹div style=opacity: 0.7; id=loading-messages›‹/div› ระยะเวลาคำสั่งหรือการหมดเวลา: 147 มิลลิวินาที ข้อมูลการสร้าง: เวอร์ชัน: '2.52.0', การแก้ไข: '4c2593c', เวลา: '2016-02-11 19:06:42' ข้อมูลระบบ : โฮสต์: 'desktop-svc71', ip: '10.2.2.54', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_73 ' - person Vdev; 25.05.2016
comment
WebDriverWait รอ = WebDriverWait ใหม่ (ไดรเวอร์, หมดเวลา); wait.until(ExpectedConditions.visibilityOfElementlocation(องค์ประกอบของคุณ)); ในนี้คุณบอกได้ไหมว่าฉันจะเขียนโค้ดข้างต้นได้อย่างไร - person Vdev; 25.05.2016
comment
สวัสดี ตามปัญหาข้อผิดพลาดของคุณไม่ได้เกิดจากการรอโดยปริยาย ซีลีเนียมที่ทำงานได้ดีสามารถคลิกได้ แต่องค์ประกอบที่คุณต้องการคลิกยังไม่ได้รับการแก้ไข [ตำแหน่งใน html ดังนั้นองค์ประกอบอื่นจะได้รับการคลิก - person eduliant; 25.05.2016
comment
เพื่อแก้ไขข้อผิดพลาดข้อยกเว้นในเธรด main org.openqa.selenium.WebDriverException: องค์ประกอบไม่สามารถคลิกได้ที่จุด (858, 409.933349609375) โปรดทำสิ่งหนึ่งโปรดเปลี่ยนเบราว์เซอร์ของคุณจาก chrome เป็น firefox หรือไปที่ลิงค์นี้ " title="องค์ประกอบซีลีเนียมไม่สามารถคลิกได้ที่จุด">stackoverflow.com/questions/37388866/ - person eduliant; 25.05.2016

คุณสามารถใส่ข้อความยืนยันว่า "ไม่ว่าจะแสดงองค์ประกอบใดหรือไม่" เพื่อให้ไดรเวอร์เว็บใช้เวลาในการค้นหาองค์ประกอบนั้นซึ่งจะสร้างความล่าช้าในการดำเนินการ

ตัวอย่าง: หน้าเว็บอาจมีปุ่มบางปุ่มที่ทำให้เป็นเป้าหมายและบอกให้ไดรเวอร์เว็บค้นหา

person Venkatesh Yalavatthi    schedule 25.05.2016