Подтвердить что ты не робот

Как проверить, существует ли элемент в драйверах С# Selenium

Итак, у меня есть эта С# winform, использующая web-серверы selenium Firefox.

В основном мне нужно, чтобы проверить, существует ли элемент и не нажимает ли он на другой. Если есть видео и после него он становится W_VIEWED

Вот что я получил до сих пор

driver.FindElement(By.XPath("//div[@class='video']/a")).Click();
else {
          driver.FindElement(By.XPath("//div[@class='W_VIEWED']/a")).Click();
     }

Ошибка 3 Только назначение, вызов, приращение, декремент, ожидание и новые объектные выражения могут использоваться как оператор 242

Вид нового для С# selenium. Спасибо за помощь.

4b9b3361

Ответ 1

Вы можете проверить выходы элементов или не использовать

bool isElementDisplayed = driver.findElement(By.xpath("element")).isDisplayed()

Помните, что findElement выдает исключение, если оно не находит элемент, поэтому вам нужно правильно его обработать.

В одном из моих приложений я обработал исключение, проверив элемент в отдельной функции,

    private bool IsElementPresent(By by)
    {
        try
        {
            driver.FindElement(by);
            return true;
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }

Функция вызова,

            if (IsElementPresent(By.Id("element name")))
            {
                //do if exists
            }
            else
            {
                //do if does not exists
            }

Ответ 2

Вы можете использовать FindElements со знаком "s", чтобы определить, существует ли он, поскольку FindElement приводит к исключению. Если FindElements не возвращает элемент, он возвращает пустой список.

List<IWebElement> elementList = new List<IWebElement>();
elementList.AddRange(driver.FindElements(By.XPath("//input[@att='something']")));

if(elementList.Count > 0)
{
 //If the count is greater than 0 your element exists.
   elementList[0].Click();
}

Ответ 3

Итак, я недавно выяснил другой способ, который намного быстрее. Если ваш элемент имеет уникальный идентификатор или какой-либо атрибут, который не существует на другом месте страницы, вы можете проверить его.

driver.PageSource.Contains("UniqueID");

Он проверяет страницу, чтобы увидеть, существует ли идентификатор или другой уникальный текст. Это происходит почти мгновенно, в отличие от использования инструкции Try/Catch, которая занимает ~ 20 секунд. FindElements также занимает много времени.

Ответ 4

Это то, что я использую. метод "verify" вернет true или false, если элемент существует. Метод с именем "testfunc" - это то, где вы вводите имя элемента. В этом примере я смотрю, отображается ли на странице "английский". Кроме того, я замечаю в комментариях выше, люди говорят, что им нужно ждать 10 секунд +, чтобы уловка работала. Попробуйте удалить явное ожидание в вашем коде, чтобы уловка работала немедленно.

static public bool verify(string elementName)
    {
        try
        {
            bool isElementDisplayed = driver.FindElement(By.XPath(elementName)).Displayed;
            return true;
        }
        catch
        {
            return false;
        }
        return false;
    }

    static void testfunc()
    {
       bool test = verify("//option[contains(.,'English')]");
        Console.WriteLine(test);

    }

Ответ 5

Я использовал принятое решение для ответа в течение некоторого времени, но мне нужен был более быстрый способ проверить, не дожидаясь тайм-аута каждый раз, когда проверка завершилась неудачно. Поэтому я сделал некоторые функции расширения, которые работают на IWebElement и IWebDriver, которые проверяют наличие тега или класса. Прошу простить непоследовательное форматирование в начале и в конце кода. Редактор SO не работает, P

public static class ExtensionMethods {

public static bool ContainsTag(this IWebElement element, string tagName)
{
    string elementText = element.GetAttribute("innerHTML");
    return CheckStringForTag(elementText, tagName);
}

public static bool ContainsClass(this IWebElement element, string className)
{
    string elementText = element.GetAttribute("innerHTML");
    return CheckStringForClass(elementText, className);
}

public static bool ContainsTag(this IWebDriver driver, string tagName)
{
    return CheckStringForTag(driver.PageSource, tagName);
}

public static bool ContainsClass(this IWebDriver driver, string className)
{
    return CheckStringForClass(driver.PageSource, className);
}

private static bool CheckStringForTag(string text, string tagName)
{
    if (!string.IsNullOrWhiteSpace(text))
    {
        return text.Contains("<" + tagName + ">") || text.Contains("</" + tagName + ">") || text.Contains("<" + tagName + " ");
    }
    return false;
}

private static bool CheckStringForClass(string text, string className)
{
    if (!string.IsNullOrWhiteSpace(text))
    {
        string pattern = string.Format(".*class[\\s]?=[\\s]?.*[\\s'\"]{0}[\\s'\"].*.*", className);
        Match m = Regex.Match(text, className, RegexOptions.IgnoreCase);
        return m.Success;
    }
    return false;
}

public static string InnerHTML(this IWebElement element)
{
    return element.GetAttribute("innerHTML");
}}

Примечание. Это похоже на, но распространяется на ответ Доминика Гиалломбардо.