C# 网页上的按钮不可单击

C# 网页上的按钮不可单击,c#,.net,selenium,selenium-chromedriver,C#,.net,Selenium,Selenium Chromedriver,我问了一段时间,我仍然面临着随机错误试图解析网页。 该场景是,系统点击“查看该商店的特价”导航并提取商店的特价。目前,以下代码仅在10%或20%的时间内有效,因为它无法找到按钮单击并导航到下一页。 我做错了什么 using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.S

我问了一段时间,我仍然面临着随机错误试图解析网页。 该场景是,系统点击“查看该商店的特价”导航并提取商店的特价。目前,以下代码仅在10%或20%的时间内有效,因为它无法找到按钮单击并导航到下一页。 我做错了什么

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    using OpenQA.Selenium.Support.UI;
    using System;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using SeleniumExtras.WaitHelpers;

      [TestClass]
      public class UnitTest1
      {
        ChromeDriver driver;
        WebDriverWait webDriverWait;
        [TestInitialize]
        public void Startup()
        {
          var chromeOptions = new ChromeOptions();
          //chromeOptions.AddArguments("headless");
          chromeOptions.AddArguments("--proxy-server='direct://'");
          chromeOptions.AddArguments("--proxy-bypass-list=*");
          //chromeOptions.AddUserProfilePreference("disable-popup-blocking", "true");
          //chromeOptions.AddArguments("--disable-extensions");
          chromeOptions.AddArguments("--start-maximized");

          var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
          ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService(path);
          driver = new ChromeDriver(chromeDriverService, chromeOptions);
          webDriverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
        }
        [TestCleanup]
        public void CleanUp()
        {
          driver.Quit();
        }
        [TestMethod]
        public void GetSproutsWeeklyAdDetails()
        {   
          try
          {        driver.Navigate().GoToUrl("http://www.sprouts.com/store/tx/plano/plano/");
          }
          catch (TimeoutException timeoutException)
          {
            driver.Navigate().Refresh();
          }
          webDriverWait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
          **var elements1 = webDriverWait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(
            By.XPath("//div[@class='cell small-6 divider']/button")));
          elements1.First().Click();**
    <= the system is unable to find the button 80% of the times

          webDriverWait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
          var elements2 = webDriverWait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(
            By.XPath("//li[@class='cell-wrapper' and @ng-repeat='item in items track by $index']"))); 
//More code below    
          }
        }
      }
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用OpenQA.Selenium;
使用OpenQA.Selenium.Chrome;
使用OpenQA.Selenium.Support.UI;
使用制度;
使用System.IO;
使用System.Linq;
运用系统反思;
使用SeleniumExtras.WaitHelpers;
[测试类]
公共类UnitTest1
{
色度驱动器;
WebDriverWait WebDriverWait;
[测试初始化]
公共无效启动()
{
var chromeOptions=新的chromeOptions();
//chromeOptions.AddArguments(“无头”);
AddArguments(“--proxy server='direct://'”;
AddArguments(“--proxy pass list=*”);
//AddUserProfilePreference(“禁用弹出窗口阻止”、“true”);
//AddArguments(“--disable extensions”);
AddArguments(“--start最大化”);
var path=path.GetDirectoryName(Assembly.getExecutionGassembly().Location);
ChromeDriverService ChromeDriverService=ChromeDriverService.CreateDefaultService(路径);
驱动程序=新的ChromeDriver(ChromeDriver服务、chromeOptions);
webDriverWait=新的webDriverWait(驱动程序,TimeSpan.FromSeconds(30));
}
[测试清理]
公共空间清理()
{
driver.Quit();
}
[测试方法]
public void getSproutSweeklyAddDetails()
{   
尝试
{driver.Navigate().gotour(“http://www.sprouts.com/store/tx/plano/plano/");
}
捕获(TimeoutException TimeoutException)
{
driver.Navigate().Refresh();
}
webDriverWait.Until(driver1=>((IJavaScriptExecutor)driver.ExecuteScript(“returndocument.readyState”).Equals(“complete”);
**var elements1=webDriverWait.Until(AllelementsLocatedBy的预期条件.Visibility)(
XPath(“//div[@class='cell small-6 divider']/button”);
元素1.First()。单击()**
((IJavaScriptExecutor)driver.ExecuteScript(“return document.readyState”).Equals(“complete”);
var elements2=webDriverWait.Until(AllelementsLocatedBy的预期条件.可见性)(
XPath(“//li[@class='cell-wrapper'和@ng repeat='item in items track By$index']);
//下面有更多代码
}
}
}
按钮不可点击区域的源代码:

<div class="cell small-6 divider">        
        <button onclick="viewStoreFlyer(event, 101)">
          <img src="https://www.sprouts.com/wp-content/themes/FoundationPress/dist/assets/images/weekly-specials-stores-icon.svg" width="32" alt="" role="presentation">
          <br>
          View this store’s specials
        </button>        
      </div>


查看本店的特价商品
在我看来,代码几乎不错,除了两件事。您正在等待所有元素都可见,然后立即要单击其中的第一个元素。首先,网站上只有一个元素包含以下xPath,因此不需要查找列表。第二个是-当元素可见时,并不意味着它是可单击的,因此更好的处理方法是:

webDriverWait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[@class='cell small-6 divider']/button"))); 

PS:在这种情况下@DebanjanB提供的答案非常好,因为您只想在与元素交互的情况下提取文本。在本例中,我们必须等待elelment准备好接收单击,这就是为什么在本例中,
ElementToBeClickable
更好。

我能够通过在单击按钮之前添加线程睡眠来实现这一点

var elements1 = webDriverWait.Until(ExpectedConditions.ElementToBeClickable(
        By.XPath("//div[@class='cell small-6 divider']/button")));
Thread.Sleep(2000);
elements1.Click();

在上一个问题中,您希望解析元素的文本,因此我们使用了所有元素的可见性。但在这个问题中,您的要求是单击
查看该商店的特价商品
,因此您的要求已更改,因此解决方案也将更改。也许@AndreiSuvorkov的答案为你指明了正确的方向。如果您需要进一步帮助,请告诉我们。Hello@DebanjanB,下面建议的解决方案无效。