所以我使用Firefox selenium webdriers获得了这个c#winform。
基本上我需要它来检查一个元素是否存在以及它是否没有点击另一个元素。如果有视频并且在观看之后它变为W_VIEWED
这是我到目前为止所得到的
driver.FindElement(By.XPath("//div[@class='video']/a")).Click();
else {
driver.FindElement(By.XPath("//div[@class='W_VIEWED']/a")).Click();
}
错误3只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句242
c#selenium的新变种。谢谢你的帮助。
答案 0 :(得分:31)
您可以使用
检查元素退出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
}
答案 1 :(得分:16)
您可以使用带有“s”的FindElements来确定它是否存在,因为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();
}
答案 2 :(得分:6)
所以我最近想出了另一种方法,它的速度要快得多。如果您的元素具有唯一ID或某个属性,该属性不存在于页面上的其他位置,则可以检查PageSource。
driver.PageSource.Contains("UniqueID");
它会检查页面以查看是否存在ID或其他唯一文本。这种情况几乎是瞬间发生的,而不是使用需要约20秒的Try / Catch语句。 FindElements也需要很长时间才能运行。
答案 3 :(得分:0)
这就是我使用的。 “verify”方法将根据元素是否存在返回true或false。名为“testfunc”的方法是输入元素名称的位置。在这个例子中,我想看看页面上是否显示“英语”。 此外,我在上面的评论中注意到,人们说他们必须等待10秒+才能使捕获工作。尝试删除代码中的显式等待以使catch立即生效。
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);
}
答案 4 :(得分:0)
我使用了已接受答案的解决方案已有一段时间了,但我需要一种更快速的方法来检查,而不是每次检查失败时都等待超时时间。所以我制作了一些可用于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");
}}
注意:这与Dominic Giallombardo的答案相似,但是有所扩展。
答案 5 :(得分:0)
Dominic Giallombardo的回答对我有用。在基于ajax的信息上加载backgrownd,需要循环来等待元素出现。因此,如果您想等待并在元素apper时执行操作,则可以使用lable和goto lable + else条件。这是修改后的代码,它将等待元素通过循环显示:
Number: 297Left: 88 Right: 209
Number: 703Left: 494 Right: 209
Number: 999Left: 998 Right: 1
Number: 1000Left: 1000 Right: 0
Number: 2223Left: 494 Right: 1729
Number: 2728Left: 744 Right: 1984
Number: 4879Left: 238 Right: 4641
Number: 4950Left: 2450 Right: 2500
Number: 5050Left: 2550 Right: 2500
Number: 5292Left: 28 Right: 5264
Number: 7272Left: 5288 Right: 1984
Number: 7777Left: 6048 Right: 1729
答案 6 :(得分:0)
此方法将允许您等待元素存在。这在有条件地创建元素(例如VueJS)的前端SPA框架中尤其重要。您可以根据应用程序的性能调整重试次数。无论如何,它将在完全失败之前等待您的ELEMENT_FIND_WAIT_TIME * ELEMENT_FIND_WAIT_RETRY_COUNT
毫秒。这解决了我们遇到的问题。
protected Func<IWebElement> GetLazyElement(By by, int retryCount=0)
{
if (retryCount >= ELEMENT_FIND_WAIT_RETRY_COUNT)
{
throw new Exception("Wait timeout for element to show up" + by.ToString());
}
return new Func<IWebElement>(() => {
try
{
Debug.WriteLine("Finding element " + by.ToString());
var element = _webDriver.FindElement(by);
return element;
}
catch (Exception)
{
Debug.WriteLine($"Failed to find element: {by} (Waiting {ELEMENT_FIND_WAIT_TIME}ms)");
Thread.Sleep(ELEMENT_FIND_WAIT_TIME);
var lazyFunc = GetLazyElement(by, retryCount++);
return lazyFunc();
}
});
}
答案 7 :(得分:0)
如果您使用的是ImplicitWait
,并且想通过使用FindElement
来查看是否存在元素,而无需等待,请尝试以下代码:
ElementExists(By.Id(id));
static public bool ElementExists(By method)
{
var oldTime = _driver.Manage().Timeouts().ImplicitWait;
_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(1);
try
{
bool isElementDisplayed = _driver.FindElement(method).Displayed;
_driver.Manage().Timeouts().ImplicitWait = oldTime;
return true;
}
catch
{
_driver.Manage().Timeouts().ImplicitWait = oldTime;
return false;
}
}