จะแก้ไข ElementNotVisibleException ในเบราว์เซอร์ Edge โดยใช้ Selenium ได้อย่างไร

ขณะนี้ฉันกำลังทดสอบเว็บแอปพลิเคชัน GWT ที่คล้ายกับ MS Paint และปัญหาที่ฉันกำลังเผชิญคือกรณีทดสอบของฉันส่งผ่านบนเบราว์เซอร์เช่น Chrome, Firefox และ IE แต่น่าเสียดายที่มันล้มเหลวในเบราว์เซอร์ Microsoft Edge ฉันไม่สามารถค้นหาวิธีแก้ปัญหานี้ได้หลังจากค้นหาในอินเทอร์เน็ตทั้งหมดและลองใช้วิธีการต่างๆ ที่เขียนไว้ใน Stack Overflow และ Google Groups ฉันรู้สึกสิ้นหวังอย่างยิ่ง ในขณะเดียวกันนี่คือรหัสของฉัน:

public class Insert_Element_in_Edge {
    private static WebDriver driver;
    @Test
    public void main() throws InterruptedException, IOException
    {
        // TODO Auto-generated method stub
        System.setProperty("webdriver.edge.driver", "D:\\SELENIUM\\Drivers\\MicrosoftWebDriver.exe");
        driver = new EdgeDriver();
        driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
        driver.manage().window().maximize();
        Thread.sleep(3000);
        driver.get("xxxx.com");
        WebDriverWait wait = new WebDriverWait(driver, 20);
        wait.until(ExpectedConditions.titleContains("xxxx"));
        WebElement canvas = driver.findElement(By.id("frontCanvas"));
        Thread.sleep(3000);
        final String InsertPath="//img[contains(@src,'Insert Element')]";
        WebElement Insert = driver.findElement(By.xpath(InsertPath));
        Thread.sleep(3000);
        Insert.click();

    }
}

นี่คือข้อผิดพลาดที่ฉันกำลังเผชิญอยู่:

org.openqa.selenium.ElementNotVisibleException: องค์ประกอบไม่แสดง (คำเตือน: เซิร์ฟเวอร์ไม่ได้ให้ข้อมูล stacktrace ใด ๆ )

รับด้านล่างเป็นรหัส HTML ขององค์ประกอบที่ฉันพยายามค้นหาในเบราว์เซอร์ Edge

<div id="isc_2Q" eventproxy="isc_XXXIconButton_SClient_1" role="button" aria-label="xxx"
    onfocus="isc.EH.handleFocus(isc_XXXIconButton_SClient_1,true);" 
    onblur="if(window.isc)isc.EH.handleBlur(isc_XXXIconButton_SClient_1,true);" 
    tabindex="1020" style="position: absolute; left: 0px; top: 54px; width: 40px; 
    height: 34px; z-index: 201152; padding: 0px; opacity: 1; overflow: visible; 
    cursor: pointer;" onscroll="return isc_XXXIconButton_SClient_1.$lh()" class="iconHoverZindex">
    <div id="isc_2R" 
        eventproxy="isc_XXXIconButton_SClient_1" style="position: relative; 
        -webkit-margin-collapse: separate separate; visibility: inherit; 
        z-index: 201152; padding: 0px; cursor: pointer;">
        <table role="presentation" cellspacing="0" cellpadding="0" width="40px" height="34px">
            <tbody>
                <tr>
                    <td nowrap="true" class="iconButton" style="background-color:transparent;"
                        align="center" valign="middle" onfocus="isc_XXXIconButton_SClient_1.$47()">
                        
                        <img src="Insert Element.png" width="24" height="24" align="TEXTTOPundefined" 
                            class="iconButtonHIcon" eventpart="icon" border="0" 
                            suppress="TRUE" draggable="true"/>
                         &nbsp;
                        <span style="vertical-align:middle;align-content:center;"></span>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

องค์ประกอบนี้มองเห็นได้ในเบราว์เซอร์อีก 3 ตัวและคลิกได้สำเร็จ แต่ฉันเพิ่งติดอยู่ใน Edge นอกจากนี้ ใน Edge ผืนผ้าใบ HTML5 จะไม่แสดงโดยใช้ Selenium เช่นกัน กรุณาช่วย.


person WarWithSelf    schedule 13.10.2017    source แหล่งที่มา
comment
องค์ประกอบใดล้มเหลวที่นี่? เป็นไปได้หรือไม่ที่จะโพสต์ URL ของเว็บไซต์?   -  person Madis Kangro    schedule 13.10.2017
comment
ขออภัย ฉันไม่สามารถโพสต์ URL ได้เนื่องจากนโยบายของบริษัทของฉัน การแทรก WebElement ล้มเหลวที่นี่   -  person WarWithSelf    schedule 13.10.2017
comment
อืม. คุณสามารถโพสต์ส่วนหนึ่งของ html ได้ไหม? ดังนั้นฉันจึงสามารถสร้างไฟล์ html ของตัวเองโดยใช้ส่วนนั้นและลองใช้ในเครื่องได้   -  person Madis Kangro    schedule 13.10.2017
comment
ฉันได้เพิ่มโค้ด HTML ในรายละเอียดคำถามแล้ว โปรดตรวจสอบ.   -  person WarWithSelf    schedule 16.10.2017
comment
อืม. ในส่วน html นั้นฉันไม่พบองค์ประกอบใด ๆ ที่คุณพยายามค้นหา ดังนั้นส่วนนี้ของ html จะไม่ทำงาน   -  person Madis Kangro    schedule 16.10.2017
comment
จาก HTML ที่คุณระบุ ฉันไม่สามารถระบุตำแหน่งองค์ประกอบใดองค์ประกอบหนึ่งได้ เช่น By.id("frontCanvas") และ //img[contains(@src,'Insert Element')] ฉันพลาดอะไรไปรึเปล่า?   -  person DebanjanB    schedule 17.10.2017
comment
@DebanjanB ขออภัยมันเป็นความผิดพลาดของฉัน ฉันลืมแก้ไข xxx.png เพื่อแทรก Element.png เนื่องจากนโยบายความเป็นส่วนตัวของบริษัท ตอนนี้ฉันได้แก้ไขแล้ว โปรดตรวจสอบ   -  person WarWithSelf    schedule 17.10.2017
comment
@ DG4 ขณะนี้เมื่อฉันใช้ html ใหม่ ฉันไม่พบส่วน frontCanvas เนื่องจากไม่ได้อยู่ใน html ดังนั้นเมื่อฉันลบส่วนนั้นออกและทำการทดสอบต่อเพื่อค้นหา webelement Insert มันก็ใช้งานได้บนคอมพิวเตอร์ Edge ของฉัน ฉันคิดว่าเราต้องการส่วนแคนวาสด้วย ตามที่ฉันเข้าใจว่าคุณกำลังใช้ html5 canvas และนั่นอาจเป็นสาเหตุของปัญหาของคุณ   -  person Madis Kangro    schedule 17.10.2017
comment
องค์ประกอบที่คุณพยายามโต้ตอบนั้นมองเห็นได้ในเบราว์เซอร์ Edge ขณะดำเนินการด้วยตนเองหรือไม่ สิ่งที่ฉันคิดว่าอาจเป็นจุดบกพร่องและนักพัฒนาแอปพลิเคชันของคุณอาจกำลังดำเนินการอยู่   -  person santhosh kumar    schedule 22.10.2017


คำตอบ (8)


คุณสามารถเพิ่มคำสั่งรอก่อนคลิกได้ตามที่ระบุด้านล่าง

wait.until(ExpectedConditions.ElementIsVisible(By.xpath(InsertPath)));
person Murthi    schedule 13.10.2017
comment
ฉันพยายามเพิ่มมันและฉันก็ทำแบบเดียวกับที่คุณแนะนำ แต่จากนั้นมันแสดง org.openqa.selenium.TimeoutException: เงื่อนไขที่คาดหวังล้มเหลว: กำลังรอการมองเห็นองค์ประกอบที่อยู่โดย By.xpath - person WarWithSelf; 13.10.2017
comment
คุณสามารถเพิ่มเวลาในการรอได้ - person Murthi; 13.10.2017
comment
ฉันพยายามเพิ่มเวลาหมดเวลาแต่ไม่ได้ผลสำหรับฉัน คุณช่วยแนะนำวิธีอื่นได้ไหม? - person WarWithSelf; 16.10.2017
comment
ลองใช้คลาสการกระทำเพื่อคลิก - person Murthi; 16.10.2017
comment
ลองแล้วยังคงเป็นปัญหาเดียวกัน - person WarWithSelf; 16.10.2017
comment
คุณสามารถอนุมานบางสิ่งจากโค้ด HTML ขององค์ประกอบที่ฉันพยายามค้นหาได้หรือไม่ - person WarWithSelf; 16.10.2017

คุณต้องใช้องค์ประกอบจึงจะสามารถคลิกได้เนื่องจากเป็นปุ่ม

WebDriverWait wait = new WebDriverWait (driver, 50);
final String InsertPath="//img[contains(@src,'Insert Element')]";
WebElement Insert= wait.until(ExpectedConditions.elementToBeClickable(By.xpath(InsertPath)));
Insert.click();
person iamsankalp89    schedule 13.10.2017
comment
ดังนั้นเพิ่มเวลาหมดเวลา หมายความว่าเว็บไซต์ของคุณต้องใช้เวลาในการโหลด - person iamsankalp89; 13.10.2017
comment
ฉันพยายามเพิ่มเวลาหมดเวลาแต่ไม่ได้ผลสำหรับฉัน คุณช่วยแนะนำวิธีอื่นได้ไหม? - person WarWithSelf; 16.10.2017

ในอดีต ฉันยังประสบปัญหาเกี่ยวกับองค์ประกอบตำแหน่งด้วย xPath ใน Edge, GWT และ Selenium น่าเสียดายที่ฉันไม่พบวิธีแก้ไข แต่มีวิธีแก้ปัญหา: เราให้ ID ทุกองค์ประกอบ

ตัวอย่างเช่น:

panel.getElement().setId("panel-id");

จากนั้นใช้ ID-Locator เพื่อค้นหาองค์ประกอบ:

findElement(By.id("panel-id"))
person KilledByCheese    schedule 16.10.2017
comment
ฉันต้องการทราบว่าฟังก์ชัน getElement() และ setId() เหล่านี้เชื่อมโยงกับ Selenium หรือ GWT หรือไม่ และถ้าไม่เป็นเช่นนั้น ฉันจะตั้งค่า ID ด้วยตัวเองได้อย่างไรเพราะฉันยังไม่ได้พัฒนาแอปพลิเคชัน GWT และฉันกำลังดำเนินการอยู่ ระบบอัตโนมัติของแอปนั้น - person WarWithSelf; 17.10.2017
comment
นอกจากนั้น สิ่งหนึ่งที่ฉันคิดว่าฉันลืมพูดถึงคือเมื่อฉันตรวจสอบว่า EdgeDriver ใน Selenium สามารถค้นหาองค์ประกอบได้หรือไม่ จากนั้นก็สามารถค้นหาองค์ประกอบเหล่านั้นได้สำเร็จ แต่ปัญหาที่แท้จริงอยู่ที่ความจริงที่ว่า พวกมันไม่สามารถมองเห็นได้และด้วยเหตุนี้จึงแสดงข้อยกเว้น - person WarWithSelf; 17.10.2017
comment
@DG4 หากคุณต้องการใช้ getElement() และ setId() ฟังก์ชันเหล่านี้เป็นส่วนหนึ่งของโค้ด GWT - เมื่อคุณสามารถค้นหา WebElements ได้ แต่การคลิก () ล้มเหลวและแม้ว่าคุณจะรอให้องค์ประกอบสามารถคลิกได้ - i จะบอกว่ามันเป็นข้อบกพร่องแปลก ๆ กับ Edge และหรือ Selinum/GWT - person KilledByCheese; 17.10.2017

ฉันอ่านคำตอบสำหรับคำถามของคุณที่ควรแก้ปัญหาของคุณ แต่ไม่มีใครถามคุณ (และคุณไม่ได้ให้ข้อมูลเราในคำถามของคุณ) เกี่ยวกับเวอร์ชันของ MicrosoftWebDriver, Selenium และ เบราว์เซอร์ ของคุณที่ คุณกำลังใช้อยู่

จากการดาวน์โหลด Microsoft WebDriver คุณใช้เวอร์ชันที่ ควรได้รับการสนับสนุนจากเบราว์เซอร์ของคุณ?

จาก เครื่องมือติดตามปัญหา EdgeHTML ฉันพบเพียง 2 ปัญหา (ที่ได้รับการแก้ไขแล้ว) กับองค์ประกอบหลัก ElementNotVisibleException

person Davide Patti    schedule 20.10.2017
comment
ฉันใช้ Selenium 3.5.3 และเวอร์ชันของ Microsoft WebDriver คือ 4.15063 ซึ่งตรงกับหมายเลขบิลด์ของพีซีของฉัน พีซีของฉันมี Windows 10 Pro Edition เวอร์ชัน 1703 และ OS Build คือ 15063.674 - person WarWithSelf; 20.10.2017
comment
@ DG4 และเวอร์ชันของเบราว์เซอร์ของคุณ? ควรเป็น 15.15063 - person Davide Patti; 20.10.2017
comment
@ DG4 ฉันคิดว่าอาจเป็นปัญหาเวอร์ชันกับบางสิ่งบางอย่าง (กับซีลีเนียม 3.5.3 ถ้าเราเชื่อในสิ่งที่ Microsoft พูด) คุณช่วยลองอัปเดตเบราว์เซอร์ของคุณเป็นเวอร์ชันล่าสุดและลองใช้ Microsoft WebDriver รุ่นล่าสุดได้ไหม อย่างไรก็ตาม หากไม่ได้ผล ฉันคิดว่ามีทางสุดขั้วที่จะเปิดปัญหาในตัวติดตามปัญหาของพวกเขา - person Davide Patti; 20.10.2017

ในกรณีเหล่านี้ ฉันมักจะจับภาพหน้าจอก่อนบรรทัดที่เกิดข้อยกเว้น และบันทึกไว้ที่ใดที่หนึ่งเพื่อตรวจสอบต่อไป ส่วนใหญ่ฉันจะต้องเพิ่มฟังก์ชัน scrollUp()/scrollToVisible() ก่อนบรรทัดนี้เพื่อแก้ไขปัญหา

person Szigyártó Mihály    schedule 22.10.2017

ฉันอยากจะแนะนำการปรับแต่งเล็กน้อยในบล็อคโค้ดของคุณดังนี้:

  1. ก่อนอื่น เราจะพยายามกำจัดการโทร Thread.sleep(n) ทั้งหมด
  2. ในตอนนี้ เพื่อระบุเหตุผลของ ElementNotVisibleException เราจะเลื่อนองค์ประกอบที่เราสนใจภายใน Viewport จากนั้นเรียกใช้เมธอด click()
  3. บล็อกโค้ดสุดท้ายของคุณอาจมีลักษณะดังนี้:

    driver = new EdgeDriver();
    driver.manage().window().maximize();
    driver.get("xxxx.com");
    WebDriverWait wait = new WebDriverWait(driver, 20);
    wait.until(ExpectedConditions.titleContains("xxxx"));
    WebElement canvas = driver.findElement(By.id("frontCanvas"));
    WebElement Insert = driver.findElement(By.xpath("//div[@id='isc_2R']//td/img[@class='iconButtonHIcon' and contains(@src,'Insert Element.png')]"));
    JavascriptExecutor jse = (JavascriptExecutor)driver;
    jse.executeScript("arguments[0].scrollIntoView()", Insert); 
    Insert.click();
    
person DebanjanB    schedule 17.10.2017
comment
ฉันลองวิธีการของคุณแล้ว และสำหรับคำสั่ง wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("frontCanvas"))); มันแสดงข้อยกเว้น TimeOut - person WarWithSelf; 20.10.2017
comment
แก้ไขคำตอบ แก้ไขโค้ดบางส่วนตามโค้ดเริ่มต้นที่เหมาะกับคุณ แจ้งสถานะค่ะ. - person DebanjanB; 23.10.2017

นอกเหนือจากข้อเสนอแนะข้างต้น

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

ลองสิ่งนี้

Select elm = new Select(driver.findElement(By.Xpath("Your element's Absolute Xpath")));
//Thread.sleep(100);
elm.selectByValue("Dropdown Value which you want to select");
person E.E    schedule 17.10.2017
comment
ใช่ สามารถใช้งานได้จริงบนหน้าจอและด้วยตนเอง ฉันสามารถดำเนินการทั้งหมดได้แต่ไม่สามารถดำเนินการผ่านระบบอัตโนมัติได้ - person WarWithSelf; 20.10.2017
comment
ลองเลือกโดยใช้ Absolute Xpath ขององค์ประกอบ เว้นแต่ว่าคุณไม่มี ID ขององค์ประกอบ หากคุณกำลังประสบปัญหานี้บนเพจที่ใช้เชิงมุม 4+ คุณอาจลองอัปเดตเวอร์ชันซีลีเนียมด้วย อีกวิธีหนึ่งอาจรอจนกว่าจะโหลดมุมมองของเชิงมุม หากมีมากกว่าหนึ่งมุมมองและคุณไม่สามารถตรวจพบได้ ให้ลองใช้ Thread.sleep ก่อนที่จะดำเนินการคลิกที่องค์ประกอบ ฉันหวังว่าหนึ่งในแนวทางเหล่านี้จะช่วยแก้ปัญหาของคุณได้ - person E.E; 20.03.2018

ฉันมีปัญหาเดียวกันกับ GWT ทุกประการ ไม่ว่าด้วยเหตุผลใดก็ตาม ไม่มีทางที่จะโทรคลิกโดยตรงได้

วิธีแก้ปัญหาที่เหมาะกับฉัน

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].click()", element);
person Jose    schedule 14.02.2021