检查元素是否在Selenium ChromeDriver中可单击

时间:2018-11-23 10:27:59

标签: c# selenium

我正在尝试通过XPath查找元素,如果找不到,请再次执行该功能。它似乎卡在了find元素函数上,我不确定为什么。我已经用相同的方法在另一个站点上工作了。这是我的尝试:

尝试1:

while (url == "https://drygoods.phish.com/dept/posters-prints-and-paper-goods")
try
{
   driver[task].FindElement(By.XPath($"//img[contains(@alt, '{Keyword}')]")).Click();
}
catch
{
   Thread.Sleep(1000);
   DryGoodsFindProductKeyword(Keyword, task);
}

尝试2:

if (driver[task].Url != "https://drygoods.phish.com/dept/posters-prints-and-paper-goods")
{
   driver[task].FindElement(By.XPath("//div[2]/div[2]/div/button")).Click();
   driver[task].Url = "https://drygoods.phish.com/cart/";
   //SolveCaptcha(task);
   driver[task].FindElement(By.Id("GoToCheckout")).Click();
   MessageBox.Show("Click Checkout");
   Thread.Sleep(5000);
}
else
{
   driver[task].FindElement(By.XPath($"//img[contains(@alt, '{Keyword}')]")).Click();
   WebDriverWait wait = new WebDriverWait(driver[task], TimeSpan.FromSeconds(5));
   wait.Until(ExpectedConditions.UrlContains("product"));
   Thread.Sleep(1000);
   DryGoodsFindProductKeyword(Keyword, task);

这也是我的完整方法:

public void DryGoodsFindProductKeyword(string Keyword, int task)
{
   String url = driver[task].Url;
   driver[task].Url = "https://drygoods.phish.com/dept/posters-prints-and-paper-goods";
   if (driver[task].Url != "https://drygoods.phish.com/dept/posters-prints-and-paper-goods")
   {
   driver[task].FindElement(By.XPath("//div[2]/div[2]/div/button")).Click();

   driver[task].Url = "https://drygoods.phish.com/cart/";
   //SolveCaptcha(task);
   driver[task].FindElement(By.Id("GoToCheckout")).Click();
   MessageBox.Show("Click Checkout");
   Thread.Sleep(5000);
   }
   else
   {
      driver[task].FindElement(By.XPath($"//img[contains(@alt, '{Keyword}')]")).Click();
      WebDriverWait wait = new WebDriverWait(driver[task], TimeSpan.FromSeconds(5));
      wait.Until(ExpectedConditions.UrlContains("product"));
      Thread.Sleep(1000);
      DryGoodsFindProductKeyword(Keyword, task);
   }
}

在此先感谢您的帮助!请让我知道是否可以添加更多信息。

1 个答案:

答案 0 :(得分:0)

要确保页面已加载而不是仅更改URL,可以使用

wait.Until(d => ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete"));

也许您的元素尚未显示或未启用。它们都是IWebElement上的属性。您可以使用它来查看它是否可点击:

wait.Until(ExpectedConditions.ElementToBeClickable(byLocatorGoesHere)).Click();

如果它稍微看不见,则可能需要使用Javascript单击它(或只是将其滚动到视图中)。