หมดเวลารับข้อความจากตัวแสดงผล: 0.100 ข้อความบันทึกโดยใช้ ChromeDriver และ Chrome v80 ผ่าน Selenium Java


39

เมื่อเร็ว ๆ นี้เราได้อัปเกรดสภาพแวดล้อมการทดสอบของเราด้วย ChromeDriver v80.0.3987.16 และ Chrome v80.0.3987.87 (รุ่นเป็นทางการ) (64 บิต) และหลังการอัปเกรดแม้โปรแกรมขั้นต่ำจะผลิตบันทึก SEVERE เหล่านี้จำนวนมาก:

[1581082019.282][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100

ก่อนหน้านี้มีการตรวจพบข้อความเหล่านี้เป็นครั้งคราวจนถึงกับคอมโบของ ChromeDriver v79.0 / Chrome v79.0

บล็อครหัสขั้นต่ำ:

public class chromeDemo 
{
    public static void main(String[] args) 
    {
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            WebDriver driver =  new ChromeDriver();
            driver.get("https://www.google.com/");
            driver.quit();
    }
}

เอาต์พุตคอนโซล:

Starting ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) on port 9194
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Feb 07, 2020 6:56:57 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
[1581082019.282][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.430][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.531][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.632][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.734][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.835][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.364][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.544][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.647][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.748][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.850][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.952][SEVERE]: Timed out receiving message from renderer: 0.100

ทุกคนหันหน้าไปทางเดียวกันหรือไม่ ChromeDriver / Chrome v80 มีการเปลี่ยนแปลงใด ๆ เกี่ยวกับ ChromeDriver / Chrome v79 หรือไม่? เบาะแสใด ๆ


7
ฉันกำลังเผชิญปัญหาเดียวกัน :(
Sooraj

6
ฉันได้รับปัญหาเดียวกันเมื่อเราอัพเกรดเป็น v80 แม้ว่าคำถามของคุณอาจจะถามว่าจะแก้ไขได้อย่างไรแทนที่จะถามว่ามีใครประสบปัญหาเดียวกันหรือไม่
Taplar

2
ฉันไม่อยากจะเชื่อว่าคำถามนี้ถูกปิด SO หลายครั้งล้มเหลวในฐานะเครื่องมือช่วย
Saeed Neamati

4
หันหน้าไปทางปัญหาเดียวกัน รหัสซีลีเนียมอัตโนมัติทั้งหมดของเราใช้งานไม่ได้ และเราไม่สามารถปรับลดรุ่นได้เนื่องจากความซับซ้อนจำนวนมาก
Saeed Neamati

2
@DebanjanB ใช่ฉันไปถึงโพสต์ของคุณ ฉันหวังว่าพวกเขาสามารถแก้ไขได้ในรุ่นถัดไป ฉันพยายามหาวิธีแก้ปัญหาดังนั้นฉันจึงได้กล่าวถึง แต่มีตัวเลือกเพิ่มเติมเพื่อป้องกันการหมดเวลา ฉันจะลองกับตัวเลือกอื่น แต่ถ้าระยะเวลาหมดเวลาน้อยกว่านี้ฉันคิดว่าเราต้องรอการเปิดตัวครั้งต่อไป
Muzzamil

คำตอบ:


24

วิธีแก้ปัญหาระหว่างกาล

นี่คือโซลูชันสำหรับผู้ใช้Chrome ที่หลากหลาย

  • หากคุณใช้Chrome v80ใช้ที่เพิ่งเปิดตัวChromeDriver 80.0.3987.106แก้ปัญหา

    • บล็อครหัส:

      System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
      WebDriver driver =  new ChromeDriver();
      driver.quit();
      
    • เอาต์พุตคอนโซล:

      Starting ChromeDriver 80.0.3987.106 (f68069574609230cf9b635cd784cfb1bf81bb53a-refs/branch-heads/3987@{#882}) on port 20041
      Only local connections are allowed.
      Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
      Feb 14, 2020 9:50:57 PM org.openqa.selenium.remote.ProtocolHandshake createSession
      INFO: Detected dialect: W3C
      
  • หากคุณใช้Chrome v81ใช้ที่เพิ่งเปิดตัวChromeDriver 81.0.4044.20แก้ปัญหา

  • ถ้าคุณใช้Chromeจากช่องDev หรือ Canaryคุณต้องรับไบนารีเฉพาะแพลตฟอร์ม:

ทางออกถาวร

อย่างไรก็ตาม@bugdroidส่งการแก้ไขที่เกิดขึ้นจริงผ่านการแก้ไข / การกระทำนี้ซึ่งเป็นดังนี้:

[ChromeDriver] หยุดการบันทึกการวนซ้ำของการลองใช้ซ้ำ : r1924789เพิ่มการลองส่งซ้ำขณะรอข้อความ DevTools บันทึกของผู้ใช้ที่เป็นสแปมนี้มีรายงานการหมดเวลาที่ไม่เป็นทางการ CL นี้ไม่แสดงข้อความบันทึกเหล่านั้นและรายงานค่าการหมดเวลาคำสั่งอย่างถูกต้องเมื่อเหมาะสม

หมายเหตุ :

  • สถานะ: แก้ไขแล้ว
  • ป้ายกำกับ: ToBeReleased ChromeDriver-82

ประวัติศาสตร์

ข้อความผิดพลาดนี้ ...

[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100

... ไม่จำเป็นต้องบ่งบอกถึงความล้มเหลว

ตามที่ @Tricia ระบุว่า ChromeDriver เวอร์ชัน 80 ได้ปรับเปลี่ยนการวนรอบการรอเพื่อให้สามารถลองใหม่ได้มากขึ้น การวนซ้ำนี้จะสร้างข้อความนั้น แต่ยังคงฟังต่อไป อย่างไรก็ตามSEVEREแท็กสำหรับข้อความนั้นทำให้เข้าใจผิด

เพิ่มเติมในการอภิปรายปัญหา 3332: ลองหมดเวลาอีกครั้งบันทึกเป็นรุนแรง , @triciac [ChromeDriver committer] ยังเสริมว่าทีม ChromeDriver เพิ่มหมดเวลาขนาดเล็ก (100 มิลลิวินาที) เพื่อDevToolsClientImpl::HandleEventsUntilที่จะช่วยให้การตรวจสอบเพิ่มเติมของสถานะนำทาง แต่น่าเสียดายที่เมื่อหมดเวลานี้มันจะถูกบันทึกเป็นSEVERE (โดยProcessNextMessage) ในกรณีของการหมดเวลาเล็กน้อยนี้ไม่ควรเข้าสู่ระบบเป็นSEVEREแม้ว่าจะหมดเวลาSendCommandInternalก็ตาม

ดังนั้น ChromeDriver จึงต้องการวิธีในการควบคุมการบันทึกในวิธีที่ดีกว่าโดยอาจเพิ่มการหมดเวลา อย่างไรก็ตามหากคำสั่งหมดเวลาในที่สุดระยะเวลาการหมดเวลาที่ระบุไว้จะน้อยมากดังนั้นจึงจำเป็นต้องแสดงรายการการหมดเวลาที่ผู้ใช้กำหนดแทน


ทางออกทันที

ในฐานะโซลูชันชั่วคราวคุณสามารถปรับลดรุ่นเป็นChromeDriver v79.0.3945.36เนื่องจากดูเหมือนว่าบันทึกSEVEREจะไม่ปรากฏในคอนโซล แต่คุณจะสังเกตเห็นคำเตือน :

[WARNING]: This version of ChromeDriver has not been tested with Chrome version 80

ซึ่งดูเหมือน... วิธีแก้ปัญหาที่ปลอดภัย ...และได้รับการยืนยันโดยสมาชิกทีมChromium

chromedriver79

  • บล็อครหัส:

    public class A_Chrome 
    {
        public static void main(String[] args) 
        {
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            WebDriver driver =  new ChromeDriver();
            driver.get("https://www.google.com/");
            driver.quit();
        }
    }
    
  • เอาต์พุตคอนโซล:

    Starting ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614}) on port 9200
    Only local connections are allowed.
    Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
    [1581503845.444][WARNING]: This version of ChromeDriver has not been tested with Chrome version 80.
    Feb 12, 2020 4:07:26 PM org.openqa.selenium.remote.ProtocolHandshake createSession
    INFO: Detected dialect: W3C
    

TL; ดร

คุณสามารถค้นหาการสนทนาที่เกี่ยวข้องใน:


1
นอกจากนี้โปรดทราบว่าข้อความบันทึกนี้ดูเหมือนว่าจะถูกเขียนไปยัง stderror ฉันมีสคริปต์ PowerShell ที่เริ่มต้นล้มเหลวหลังจากรันการทดสอบโดยใช้vstest.console.exeเพราะ$?ตัวแปรPowerShell $falseแม้ว่าจะผ่านการทดสอบ PowerShell ดูเหมือนจะคิดอะไรถูกเขียนไป stderror คือความล้มเหลวแม้$LastExitCodeสำหรับนักวิ่งทดสอบกลับศูนย์
Greg Burghardt

4
Re: Chrome v80 โดยใช้ ChromeDriver 80.0.3987.106 ที่เพิ่งเปิดตัวแก้ไขปัญหา Re: Chrome v81 โดยใช้ ChromeDriver 81.0.4044.20 ที่เพิ่งเปิดตัวแก้ไขปัญหา ฉันยังคงเห็นปัญหาเกี่ยวกับการอัปเดต ChromeDirver
Neil

1
ใช่ !!!!! ChromeDriver v79 win32 ทำงานได้ดีกับ chrome v80.0.3987.132 และไม่ให้ข้อผิดพลาด TimedOut ในคอนโซล แต่บางครั้ง Chromedriver ไม่สามารถเริ่มเซิร์ฟเวอร์ได้
Surodip

1
การใช้วิธีแก้ปัญหา chromedriver v79 ไม่สามารถใช้งานกับโครเมี่ยมที่เสถียรรุ่นล่าสุด (81.0.4044.92) ได้อีกต่อไปด้วยไดรเวอร์ที่ไม่สามารถแม้แต่เปิดโครเมี่ยมได้ ฉันอัพเกรด Chromedriver เป็นรุ่นล่าสุดและใช้งานได้ แต่ข้อผิดพลาดการหมดเวลาที่รุนแรงได้ส่งคืน
PST

@PST - ปัญหาเดียวกันแน่นอน มันน่าหงุดหงิด
Sriram Ilango

10

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

วิธีแก้ไข:เมื่อการโหลดหน้าเว็บใช้เวลานานเกินไปและคุณต้องหยุดการดาวน์โหลดแหล่งข้อมูลย่อยเพิ่มเติม (รูปภาพ, css, js และอื่น ๆ )คุณสามารถเปลี่ยน pageLoadStrategy ผ่าน webdriver ได้

โค้ดด้านล่างโหลดเนื้อหา HTMLจากหน้าเว็บ คุณสามารถกำหนดกลยุทธ์การโหลดหน้าเว็บได้จากchromeoptions

ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);

อัปเดตโซลูชัน -2:ฉันเห็นด้วยกับ DebanjanB, กลยุทธ์ PageLoad ด้วยไม่มีโดยไม่ต้องดาวน์โหลดไฟล์เพิ่มเติม (รูปภาพ, css, js ฯลฯ ) ไม่ใช่ความคิดที่ดีในขณะทำการทดสอบ ฉันค้นหาปัญหาทั้งหมดแล้วลองค้นหาวิธีแก้ไขที่ถูกต้อง ฉันลองตัวเลือกด้านล่างเพราะบางครั้งก็สามารถแก้ไขปัญหานี้ได้

    options.addArguments("start-maximized"); 
    options.addArguments("enable-automation"); 
    options.addArguments("--no-sandbox"); 
    options.addArguments("--disable-infobars"); 
    options.addArguments("--disable-dev-shm-usage"); 
    options.addArguments("--disable-browser-side-navigation"); 
    options.addArguments("--disable-gpu");

ไม่มีใครช่วย แต่ฉันพบวิธีแก้ปัญหาอีกครั้งด้วยกลยุทธ์การโหลดหน้า ครั้งนี้เรากำลังดาวน์โหลดแหล่งข้อมูลย่อยทั้งหมด แต่เรากำลังรอเหตุการณ์DOMContentLoaded กลยุทธ์นี้เรียกว่ากระตือรือร้นกระตือรือร้นคำจำกัดความเล็ก ๆ ของกลยุทธ์การโหลดหน้าเว็บทั้ง 3 แบบ

1. ปกติ: กลยุทธ์นี้ทำให้ Selenium รอการโหลดแบบเต็มหน้าเว็บ (เนื้อหา HTML และทรัพยากรย่อยที่ดาวน์โหลดและแยกวิเคราะห์)

2. กระตือรือร้น: กลยุทธ์นี้ทำให้ Selenium ต้องรอเหตุการณ์ DOMContentLoaded (ดาวน์โหลดเนื้อหา HTML และแยกวิเคราะห์เท่านั้น)

3. ไม่มี: กลยุทธ์นี้ทำให้ Selenium กลับมาทันทีหลังจากได้รับเนื้อหาหน้าเริ่มต้นอย่างสมบูรณ์ (ดาวน์โหลดเนื้อหา HTML)

หมายเหตุ:โดยค่าเริ่มต้นเมื่อซีลีเนียมโหลดหน้าเว็บจะเป็นไปตามหน้าปกติ LoadStrategy

ข้อมูลโค้ดโดยไม่ใช้กลยุทธ์ Pageload (หรือปกติตามที่ซีลีเนียมใช้เป็นค่าเริ่มต้น)

System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");   
WebDriver driver=new ChromeDriver();
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();

เอาต์พุตคอนโซล:

การเริ่มต้น ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) บนพอร์ต 41540 อนุญาตเฉพาะการเชื่อมต่อท้องถิ่น โปรดปกป้องพอร์ตที่ใช้โดย ChromeDriver และกรอบการทดสอบที่เกี่ยวข้องเพื่อป้องกันการเข้าถึงโดยรหัสที่เป็นอันตราย 11 ก.พ. 2020 10:22:12 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: ภาษาที่ตรวจพบ: W3C [1581412933.937] [SEVERE]: หมดเวลารับข้อความจากตัวเรนเดอร์: 0.100 [1581412934.066] ได้รับข้อความจาก renderer: 0.100 [1581412934.168] [SEVERE]: หมดเวลารับข้อความจาก renderer: 0.100 [1581412934.360] [SEVERE]: หมดเวลารับข้อความจาก renderer: 0.100 [1581412934.461] [SEVERE]: หมดเวลารับข้อความจาก renderer: 0.100 0.100 [1581412934.618] [SEVERE]:

ด้วยกลยุทธ์ PageLoad - กระตือรือร้น:

ตัวอย่างโค้ด:

System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver=new ChromeDriver(options);
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();

เอาต์พุตคอนโซล:

การเริ่มต้น ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) บนพอร์ต 1175 อนุญาตเฉพาะการเชื่อมต่อท้องถิ่น โปรดปกป้องพอร์ตที่ใช้โดย ChromeDriver และกรอบการทดสอบที่เกี่ยวข้องเพื่อป้องกันการเข้าถึงโดยรหัสที่เป็นอันตราย 11 ก.พ. 2020 10:29:05 AM org.openqa.selenium.remote.ProtocolHandshake createSession ข้อมูล: ภาษาที่ตรวจพบ: W3C
21


โดยทั่วไปคุณจะไม่สามารถปรับแต่งกลยุทธ์ PageLoad เนื่องจากการกำหนดค่า WebDriver นั้นเป็นมาตรฐานและเหมาะสมที่สุดกับกลยุทธ์การทดสอบที่ต้องการ อย่างไรก็ตามในการอภิปรายวิธีที่จะทำให้ซีลีเนียมไม่ต้องรอจนถึงการโหลดหน้าเต็ม , ไม่ต้องรอให้การโหลดหน้าเว็บเราได้กล่าวถึงในรายละเอียด เป็นปัญหากับ ChromeDriver v80
DebanjanB

2
@DebanjanB ฉันเห็นด้วยกับคุณ แต่ที่คุณรู้ว่าเป็นชุมชนเกี่ยวกับการแก้ปัญหา ฉันพยายามแก้ปัญหาที่ดีที่สุดเท่าที่จะทำได้ หากคุณรู้ว่ามันเป็นปัญหาหรือข้อบกพร่องในไดรเวอร์โครเมี่ยมแล้วเราต้องบันทึกปัญหานี้ในโครงการ Git หรือสถานที่ที่แนะนำ การตั้งคำถามใน SO จะไม่ช่วย
Muzzamil

ฉันเพิ่งอัปเดต Chrome และ Chromedriver ของฉันเมื่อเร็ว ๆ นี้จากนั้นเริ่มรับข้อความเตือนเหล่านี้ทั้งหมด ตอนนี้ฉันกำลังพยายามปรับลดรุ่น Chrome และไม่สามารถหาตำแหน่งที่จะรับ chrome 79v ได้ ใครช่วยให้ฉันลิงค์เพื่อดาวน์โหลด chrome 79v
Vin

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