Как проверить, существует ли элемент в драйверах С# 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. Спасибо за помощь.
Ответы
Ответ 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");
}}
Примечание. Это похоже на, но распространяется на ответ Доминика Гиалломбардо.