Как исправить ElementNotVisibleException в браузере Edge с помощью Selenium?

В настоящее время я тестирую веб-приложение GWT, похожее на MS Paint, и проблема, с которой я столкнулся, заключается в том, что мой тестовый пример проходит в таких браузерах, как Chrome, Firefox и IE, но, к сожалению, он не работает в браузере Microsoft Edge. Я не могу найти, как решить эту проблему после поиска по всему Интернету и опробования многих методов, которые написаны на переполнении стека и группах Google, я чувствую себя крайне безнадежно. Между тем, вот мой код:

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: элемент не отображается (ВНИМАНИЕ: сервер не предоставил никакой информации о трассировке стека)

Ниже приведен 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
Какой из элементов здесь не работает? Можно ли размещать адрес сайта или нет?   -  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 на Insert Element.png из-за политики конфиденциальности компании. Теперь я отредактировал это, пожалуйста, проверьте   -  person WarWithSelf    schedule 17.10.2017
comment
@ DG4 В настоящее время, когда я использую новый html. Я не могу найти часть frontCanvas, потому что ее нет в html. Поэтому, когда я удалил эту часть и продолжил тест для поиска вставки веб-элемента, он работает здесь, на моем пограничном компьютере. Я думаю, что нам также нужна часть холста. Насколько я понимаю, вы используете холст html5, и это может быть причиной ваших проблем.   -  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. К сожалению, я не нашел решения, но обходной путь: мы дали каждому элементу идентификатор

Например:

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

а затем использовал ID-локатор, чтобы найти элемент:

findElement(By.id("panel-id"))
person KilledByCheese    schedule 16.10.2017
comment
Ну, я хочу знать, связаны ли эти функции getElement() и setId() с Selenium или GWT, и если нет, то как мне установить идентификатор самостоятельно, потому что я не разработал приложение GWT, и я работаю только над автоматизация этого приложения. - person WarWithSelf; 17.10.2017
comment
Наряду с этим, я думаю, что забыл упомянуть одну вещь: когда я проверяю, может ли EdgeDriver в Selenium находить элементы или нет, он успешно находит эти элементы, но настоящая проблема заключается в том, что они не были видны и, таким образом, показывали исключение. - person WarWithSelf; 17.10.2017
comment
@DG4 DG4, если вы хотите использовать getElement () и setId (), эти функции являются частью кода GWT. Когда вы можете найти веб-элементы, но щелчок () не работает, и даже если вы ждете, пока элемент станет доступным для клика — я сказал бы, что это странная ошибка с Edge и/или Selinum/GWT - person KilledByCheese; 17.10.2017

Я прочитал ответы на ваш вопрос, которые должны решить вашу проблему. Но никто не спрашивал вас (и вы не предоставили нам в своем вопросе) информацию о версии вашего MicrosoftWebDriver, Selenium и браузера, которые ты используешь.

Используете ли вы версию, должен поддерживаться вашим браузером?

Из системы отслеживания ошибок EdgeHTML. Я обнаружил только две проблемы (которые были устранены) с ключевым элементом ElementNotVisibleException.

person Davide Patti    schedule 20.10.2017
comment
Я использую Selenium 3.5.3, а версия Microsoft WebDriver — 4.15063, что соответствует номеру сборки моего ПК. На моем ПК установлена ​​Windows 10 Pro Edition версии 1703 и сборки ОС 15063.674. - person WarWithSelf; 20.10.2017
comment
@DG4 и версия твоего браузера? должно быть 15.15063 - person Davide Patti; 20.10.2017
comment
@ DG4 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
Попробуйте выбрать его, используя Абсолютный Xpath элемента, если у вас нет идентификатора элемента. Если у вас возникла эта проблема на странице, на которой используется angular 4+, вы также можете попробовать обновить версию selenium. Также другой подход может ждать загрузки угловых представлений. Если существует более одного представления, и вы не можете их обнаружить, попробуйте Thread.sleep, прежде чем выполнять Click on element. Я надеюсь, что один из этих подходов решит вашу проблему. - person E.E; 20.03.2018

У меня точно такая же проблема с GWT. По какой-либо причине нет возможности вызвать click напрямую.

Обходной путь, который сработал для меня

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