Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

WebDriver не видит елемент


(Serhii) #1

есть поле в форме с id=“Email”

<div>
<span class="twitter-typeahead" style="position: relative; display: inline-block;">
<input class="tt-hint" type="text" disabled="" spellcheck="off" autocomplete="off" style="position: absolute; top: 0px; left: 0px; border-color: transparent; box-shadow: none; background: none repeat scroll 0% 0% rgb(255, 255, 255);"/>
<input id="Email" class="form-control tt-query" type="text" value="" name="Email" data-source-url="/BackOffice/en/Application/ApplicantEmails" autocomplete="off" spellcheck="false" style="position: relative; vertical-align: top; background-color: transparent;" dir="auto"/>
<span style="position: absolute; left: -9999px; visibility: hidden; white-space: nowrap; font-family: "Open Sans",sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; word-spacing: 0px; letter-spacing: 0px; text-indent: 0px; text-rendering: optimizelegibility; text-transform: none;"/>
<span class="tt-dropdown-menu" style="position: absolute; top: 100%; left: 0px; z-index: 100; display: none;"/>
</span>
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Email"/>
</div>

при прогоне теста часто Selenium его не находит :
calling element: ‘By.Id: Email’ —> OpenQA.Selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with
в OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
В чем может быть причина?


(sidelnikovmike) #2

а вот интересно - он реально в этот момент отображается?
Попробуйте скриншот снимать перед взаимодействием и посмотрите.
Ну или пробуйте играться с ожиданиями.


(sidelnikovmike) #4

ну значит как то надо ждать.


(Jane Tymoschuk) #5

Логичнее всего ждать появления лоадера не очень долгое время, я обычно использую 1-2 секунды, так как считаю, что если он появляется с большей задержкой, то это уже можно считать багом.
Если он появился, то ожидать его исчезновения. Этот таймаут должен соответствовать приемлемому времени ожидания для пользователя конкретного действия.
Если лоадер уже исчез или не появлялся, то стоить добавить ожидание visibilityOfElementLocated или elementToBeClickable, так как вероятно, что этот элемент может перерисовываться. Так можно будет еще и ошибки вида StaleElementReferenceException избежать


(Serhii) #6

Хочу добавить свой ExpectedConditions для эмплицитного ожидания на С#:

public static Func<IWebDriver, IWebElement> ElementIsClickable(By by)
        {
            return driver =>
            {
                var element = driver.FindElement(by);
                return (element != null && element.Displayed && element.Enabled) ? element : null;
            };
        }

        public static void WaitAndToBeClickable(this IWebDriver driver, By by)
        {
            IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
            IWebElement element = wait.Until(ExpectedConditions.ElementIsClickable(by));
        }

Но проект не компилиться, т.к почему-то мой метод ElementIsClickable() конфликтует с нативной либой
Error 165 ‘OpenQA.Selenium.Support.UI.ExpectedConditions’ does not contain a definition for ‘ElementIsClickable’


(Александр Таранков) #7

Конечно конфликтует, ведь ты вызываешь несуществующий метод.

В ExpectedConditions есть метод until(), в который надо передать твою реализацию ожидания. По крайней мере в Java так, наверное и в C# как-то так же должно быть


(Serhii) #8

Ясненько.
Но в С# нельзя просто так взять и добавить в либу свой метод, т.к она вся .dll(
Selenium.WebDriver.2.43.0\net40\WebDriver.Support.dll

Может кто имеет дело с С# и сталкивался с добавлением в библиотеки своих методов расскажет как это сделать.


(Александр Таранков) #9

Об этом никто и не говорит. Поразбирайся с тем как использовать механизм ExpectedConditions.

Я в предыдущем своем сообщении написал неправильно. Метод until() находится в классе WebDriverWait, а не в ExpectedConditions. Погугли как его использовать, это не сложно. Вот, например