Bagaimana cara memperbaiki ElementNotVisibleException di browser Edge menggunakan Selenium?

Saat ini saya sedang menguji aplikasi web GWT yang mirip dengan MS Paint dan masalah yang saya hadapi adalah kasus pengujian saya lolos di browser seperti Chrome, Firefox, dan IE tetapi sayangnya, gagal di browser Microsoft Edge. Saya tidak dapat menemukan cara memperbaiki masalah ini setelah mencari di seluruh Internet dan mencoba banyak metode yang tertulis di Stack Overflow dan Google Grup, saya merasa sangat putus asa. Sementara itu, ini kode saya:

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();

    }
}

Inilah kesalahan yang saya hadapi:

org.openqa.selenium.ElementNotVisibleException: Elemen tidak ditampilkan (PERINGATAN: Server tidak memberikan informasi stacktrace apa pun)

Diberikan di bawah ini adalah kode HTML elemen yang saya coba temukan di browser 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>

Elemen ini terlihat di 3 browser lain dan berhasil diklik. Tapi saya baru saja terjebak di Edge. Selain itu, di Edge, kanvas HTML5 juga tidak ditampilkan menggunakan Selenium. Tolong bantu.


person WarWithSelf    schedule 13.10.2017    source sumber
comment
Elemen manakah yang gagal di sini? Apakah mungkin untuk memposting url situs web atau tidak?   -  person Madis Kangro    schedule 13.10.2017
comment
Maaf saya tidak dapat memposting URL karena kebijakan perusahaan saya. Sisipan WebElement gagal di sini.   -  person WarWithSelf    schedule 13.10.2017
comment
Hmm. Bisakah Anda memposting bagian dari html? Jadi saya bisa membuat file html sendiri menggunakan bagian itu dan mencobanya secara lokal.   -  person Madis Kangro    schedule 13.10.2017
comment
Saya telah menambahkan kode HTML di detail pertanyaan. Silakan periksa.   -  person WarWithSelf    schedule 16.10.2017
comment
Hmm. Di bagian html itu saya tidak dapat menemukan elemen apa pun yang Anda coba temukan. Jadi bagian html ini tidak akan berfungsi.   -  person Madis Kangro    schedule 16.10.2017
comment
Dari HTML yang Anda berikan, saya tidak dapat menemukan salah satu elemen yaitu By.id("frontCanvas") dan juga //img[contains(@src,'Insert Element')]. Apakah saya melewatkan sesuatu?   -  person DebanjanB    schedule 17.10.2017
comment
@DebanjanB, maaf itu kesalahan saya. Saya lupa mengedit xxx.png ke Sisipkan Elemen.png karena kebijakan privasi perusahaan. Sekarang, saya sudah mengeditnya, silakan periksa   -  person WarWithSelf    schedule 17.10.2017
comment
@DG4 Saat ini saya menggunakan html baru. Saya tidak dapat menemukan bagian frontCanvas karena tidak ada di html. Jadi ketika saya menghapus bagian itu dan melanjutkan tes untuk mencari sisipan elemen web, maka itu berfungsi di sini di komputer edge saya. Saya pikir kita memerlukan bagian kanvas juga. Seperti yang saya pahami, Anda menggunakan kanvas HTML5 dan itu mungkin penyebab masalah Anda.   -  person Madis Kangro    schedule 17.10.2017
comment
Elemen yang Anda coba interaksikan, terlihat di browser Edge saat dilakukan secara manual? Menurut saya, ini mungkin bug dan mungkin diperbaiki oleh pengembang aplikasi Anda.   -  person santhosh kumar    schedule 22.10.2017


Jawaban (8)


Anda dapat menambahkan pernyataan tunggu sebelum mengkliknya seperti yang diberikan di bawah ini.

wait.until(ExpectedConditions.ElementIsVisible(By.xpath(InsertPath)));
person Murthi    schedule 13.10.2017
comment
Saya mencoba menambahkannya dan saya melakukannya dengan cara yang sama seperti yang Anda sarankan tetapi kemudian muncul org.openqa.selenium.TimeoutException: Kondisi yang diharapkan gagal: menunggu visibilitas elemen yang terletak oleh By.xpath - person WarWithSelf; 13.10.2017
comment
Anda dapat menambah waktu menunggu - person Murthi; 13.10.2017
comment
Saya mencoba menambah waktu tunggu tetapi tidak berhasil. Bisakah Anda menyarankan metode lain? - person WarWithSelf; 16.10.2017
comment
coba dengan kelas tindakan untuk mengkliknya. - person Murthi; 16.10.2017
comment
Mencobanya, masih masalah yang sama. - person WarWithSelf; 16.10.2017
comment
dapatkah Anda menyimpulkan sesuatu dari kode HTML elemen yang saya coba temukan. - person WarWithSelf; 16.10.2017

Anda harus menggunakan elemen agar dapat diklik karena ini adalah tombol

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
Jadi tambah waktu tunggu, itu berarti situs web Anda membutuhkan waktu untuk dimuat - person iamsankalp89; 13.10.2017
comment
Saya mencoba menambah waktu tunggu tetapi tidak berhasil. Bisakah Anda menyarankan metode lain? - person WarWithSelf; 16.10.2017

Di masa lalu saya juga mengalami beberapa masalah lokasi elemen dengan xPath di Edge, GWT dan Selenium Sayangnya saya tidak menemukan solusi tetapi solusi: Kami memberi ID pada setiap Elemen

Misalnya:

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

dan kemudian menggunakan ID-Locator untuk menemukan Elemen:

findElement(By.id("panel-id"))
person KilledByCheese    schedule 16.10.2017
comment
Baiklah, saya ingin tahu apakah fungsi getElement() dan setId() ini dikaitkan dengan Selenium atau GWT dan jika tidak, lalu bagaimana cara mengatur ID sendiri karena saya belum mengembangkan aplikasi GWT dan saya sedang mengerjakannya saja otomatisasi aplikasi itu. - person WarWithSelf; 17.10.2017
comment
Bersamaan dengan itu, satu hal yang saya rasa lupa saya sebutkan adalah ketika saya memeriksa apakah EdgeDriver di Selenium dapat menemukan elemen tersebut atau tidak, maka berhasil menemukan elemen tersebut tetapi masalah sebenarnya terletak pada kenyataan bahwa mereka tidak terlihat dan dengan demikian, menunjukkan pengecualian. - person WarWithSelf; 17.10.2017
comment
@ DG4 jika Anda ingin menggunakan getElement() dan setId() fungsi-fungsi ini adalah bagian dari kode GWT - Ketika Anda dapat menemukan WebElements tetapi click() gagal dan bahkan jika Anda menunggu Elemen dapat Diklik - i akan mengatakan ini bug aneh dengan Edge dan atau Selinum/GWT - person KilledByCheese; 17.10.2017

Saya membaca jawaban atas pertanyaan Anda yang seharusnya menyelesaikan masalah Anda. Namun tidak ada yang menanyakan kepada Anda (dan Anda tidak memberi kami, dalam pertanyaan Anda) informasi tentang versi MicrosoftWebDriver, Selenium, dan Browser Anda yang apakah kamu menggunakan.

Dari unduhan Microsoft WebDriver, apakah Anda menggunakan versi yang harus didukung dari browser Anda?

Dari pelacak masalah EdgeHTML, Saya hanya menemukan 2 masalah (yang telah diperbaiki) dengan elemen kunci ElementNotVisibleException.

person Davide Patti    schedule 20.10.2017
comment
Saya menggunakan Selenium 3.5.3 dan versi Microsoft WebDriver adalah 4.15063 yang sesuai dengan nomor build PC saya. PC saya memiliki Windows 10 Pro Edition, versi 1703 dan OS Build 15063.674. - person WarWithSelf; 20.10.2017
comment
@ DG4 dan versi browser Anda? seharusnya 15.15063 - person Davide Patti; 20.10.2017
comment
@ DG4 Saya pikir mungkin ada masalah versi dengan sesuatu (dengan Selenium 3.5.3, jika kami mempercayai apa yang dikatakan Microsoft). Bisakah Anda mencoba memperbarui browser Anda ke versi terbaru dan mencoba dengan rilis terbaru Microsoft WebDriver? Lagi pula, jika tidak berhasil, menurut saya ada cara ekstrem untuk membuka masalah di pelacak masalah mereka. - person Davide Patti; 20.10.2017

Dalam kasus ini saya biasanya mengambil tangkapan layar tepat sebelum baris di mana pengecualian terjadi dan menyimpannya di suatu tempat untuk penyelidikan lebih lanjut. Maka saya sebagian besar harus menambahkan fungsi scrollUp()/scrollToVisible() sebelum baris ini untuk memperbaiki masalah.

person Szigyártó Mihály    schedule 22.10.2017

Saya akan menyarankan beberapa penyesuaian pada blok kode Anda sebagai berikut:

  1. Pertama-tama kita akan mencoba menghilangkan semua panggilan Thread.sleep(n).
  2. Sekarang, untuk mengatasi alasan ElementNotVisibleException, kita akan menggulir elemen yang kita minati dalam Viewport lalu panggil metode click().
  3. Blok kode terakhir Anda mungkin terlihat:

    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
Saya mencoba metode Anda dan untuk pernyataan wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("frontCanvas"))); ini menunjukkan pengecualian TimeOut. - person WarWithSelf; 20.10.2017
comment
Mengedit Jawaban, memodifikasi sebagian kode sesuai kode awal yang sesuai untuk Anda. Beritahu aku statusnya. - person DebanjanB; 23.10.2017

Selain saran di atas,

Pastikan "Elemen Anda" yang Anda cari terlihat secara fisik di layar Browser Anda. Artinya, jika elemen tidak terlihat, pengguna perlu menggulir ke bawah untuk melihatnya. Pengemudi berperilaku serupa. Untuk mencegah pengecualian "ElementNotVisiable", pastikan pengecualian tersebut juga terlihat di halaman browser

Coba ini,

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
Ya, ini tersedia secara fisik di layar dan secara manual, saya dapat melakukan semua tindakan tetapi tidak melalui otomatisasi. - person WarWithSelf; 20.10.2017
comment
Cobalah untuk memilihnya dengan menggunakan Absolute Xpath elemen, kecuali Anda tidak memiliki ID elemen tersebut. Jika Anda mengalami masalah ini pada halaman yang menggunakan sudut 4+, Anda juga dapat mencoba memperbarui versi Selenium. Pendekatan lain juga bisa menunggu hingga tampilan sudut dimuat. Jika ada lebih dari satu tampilan dan Anda tidak dapat mendeteksinya, coba Thread.sleep sebelum Anda menjalankan elemen Click on. Saya harap salah satu pendekatan ini akan menyelesaikan masalah Anda. - person E.E; 20.03.2018

Saya memiliki masalah yang persis sama dengan GWT. Untuk alasan apa pun tidak ada cara untuk menelepon klik secara langsung.

Solusi yang berhasil untuk saya

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