Я вам написал пример выше как сделать чтоб работало и обрабатывать любые ошибки, но на скриншоте опять вижу что все по старому, так работать стабильно не будет
У меня есть старые тесты по-староиму и новые по -новому, для разных приложений
Старые тесты работали, только нужно было их перевести на новый фреймворк. Но видимо нужно не быстро тяп-ляп, а долго но красиво. Сейчас сделаю и напишу
if (ManufactPart.ddlMachine.Displayed)
{
ManufactPart.ddlMachine.SendKeys(machine);
}
Так лучше не делать тесты должны быть линейными
ManufactPart.ddlMachine.Displayed @Noksa прав, элемент уже найден, вы просто проверяете, элемент отображается или скрыт, но он должен существовать
самый простой и топорный способ для определения существует элемент на данный момент или нет
public bool Exist (By locator)
{
try
{
driver.FindElement(locator);
return true;
}
catch
{
return false;
}
}
Но такой метод не будет работать если есть задержка перед появлением или исчезанием, там еще нужно будет накинуть логику на ожидание
Посмотрите в сторону этого фраемворка, по идее он решит ваши проблемы
Правда возможно тут нет поддержки протрактора, а он для Angular желателен
Мне нужен протрактор. Вариант на что-то менять - не вариант.
Для процесса отладки чуть “улучшила” метод
Если элемент не существует, я ловлю “странный” эксепшин
“wait=error CS0103: The name ‘wait’ does not exist in the current context”
отдаю методу isdisplayed значение element =null и прекрасненько двигаюсь дальше.
В случае когда элемент существует, я получаю этот же эксепшин.
Говорят проблема в 2019-06-26_1655 , причем я добавляла пакет и protractor core, и frwamework - ошибки одинаковые.
Нет проблема не в этом, там что то не так в логике метода
Я согласна что проблема в логике метода, но в чем… Может коллективный разум мне поможет разобраться.
Сидуация такая. На странице есть несколько элементов. Один тест заполняет все элементы и все ок.
Второй тест. При определенный условия выбора одного из элементов, несколько других эелементов прячутся. Собственно это причина почему я проверяю есть ли элемент на странице и если нет - пропускаю.
Тут начинается самое интересное.
Заполняю видимые эдементы.
Проверяю есть ли элемент на странице и если есть вписываю значение
if (AdditionalOptions.IsElementDisplayed(Driver, Part.ddlMachine))
Part.ddlMachine.SendKeys(machine);
Собственно сам локатор
public IWebElement ddlglossfactor => PropertiesCollection.Driver.FindElementClickable(By.Id("m-p-prop-1"), 10);
Тут происходит поиск.
public static IWebElement FindElementClickable(this NgWebDriver driver, By by, int timeoutInSeconds = 30)
{
try
{
var wait = new DefaultWait<IWebDriver>(driver);
wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException), typeof(NoSuchElementException), typeof(Exception));
wait.Timeout = TimeSpan.FromSeconds(timeoutInSeconds);
wait.Until(d => d.FindElement(by).Displayed && d.FindElement(by).Enabled);
return driver.FindElement(by);
}
catch (Exception)
{
return null;
}
}
public static bool IsElementDisplayed(IWebDriver driver, IWebElement element)
{
var present = false;
try
{
present = element.Displayed;
}
catch (NoSuchElementException)
{
return false;
}
catch (NullReferanceException)
{
return false;
}
catch
{
return false;
}
return present;
}
Так вот если элемент не найден по какой-то причине - драйвер ждет 60 сек и падает по таймайту. Меня это почти устраивает, хотя таймаут задаю 30 сек, а то и меньше, но это значение игнорится.
Но основная проблема в том, что следующий элемент, который есть на странице - тоже падает с таким же таймаутом, потому что не может найти.
Т.е. фактически выглядит так , как будет-то драйвер умер за 60 секунд поиска не существующего элемента. После первого таймаута поиск всех последующие элементов падает с таймаутом.
вы пробывали выключить синхронизацию в протракторе?
Синхронизацию? В смысле wrappeddriver?
На некоторых страницах синхронизация может не работать
делайте так:
Driver.IgnoreSynchronization = true;
но там где все ок нужно включать
Driver.IgnoreSynchronization = false;
Страница чистый ангуляр, должно же работать. И элементы же находит. Проблемы возникают только если не находит.
бывает не работает, вы затестили?
Driver.IgnoreSynchronization = false; добавила. Ничего не поменялось.
Смотрите(чуть поменяла метод), в первом случае когда элемент есть, находит и возвращает найденный элемент 2019-07-03_1435
Во втором случае, начинаю проверять наличие элемента и все.
Проблему я решила. С методами и тестами было все ок. На самом деле, я опять портировала .netframework тысты, добавила 2019-08-01_1628 пару пакетов, которые нашла в рекоменлациях гугла. Что действительно решило проблему , или аккуратное портирвоание или эти пакеты для правильно локализации пейдж-объектов, я не знаю. Но склоняюсь к мысли что все же второе.