硒无法找到元素

时间:2018-07-31 19:44:48

标签: c# selenium

我正在使用Selenium从网站上下载一些数据,特别是url

如您所见,有两个标签:

  • 全职
  • 上半场

enter image description here

我正在尝试通过模拟通过1st Half对其的点击来访问Selenium内容,这是我的代码:

var chromeOpts = new ChromeOptions();
chromeOpts.AddArguments("headless");
var chromeDriverService = ChromeDriverService.CreateDefaultService();
driver = new ChromeDriver(chromeDriverService, chromeOpts);
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);            
driver.Navigate().GoToUrl(new Uri("http://www.oddsportal.com/soccer/usa/mls/chicago-fire-new-york-city-CAl0LCJs/?r=1#ah;2"));
driver.FindElement(By.XPath("//*[contains(text(),'1st') and contains(text(),'Half')]")).Click();
string html = driver.PageSource;

问题是我收到此错误:

  

OpenQA.Selenium.ElementNotVisibleException:'元素不可见

我虽然我的XPath是错误的,但是我尝试了其他选项卡并工作,但html的结构也是正确的。

发生了什么事?

3 个答案:

答案 0 :(得分:1)

您具有唯一的ID bettype-tabs-scope,并且有ul和3个li元素。

<div id="bettype-tabs-scope" class="tab-nav-detail">
  <ul class="sub-menu subactive" style="display: block;">
    <li class=" active"><span class="topleft_corner"></span><span class="topright_corner"></span><strong><span>Full&nbsp;Time</span></strong></li>
    <li class=""><a onmousedown="uid(28)._onClick();return false;" title="1st&nbsp;Half" href=""><span>1st&nbsp;Half</span></a></li>
    <li class="last"><a onmousedown="uid(29)._onClick();return false;" title="2nd&nbsp;Half" href=""><span>2nd&nbsp;Half</span></a></li>
  </ul>
</div>

您可以轻松做到:

//Find the unique element and the get all children list items.
var listItems = driver.FindElement(By.Id("bettype-tabs-scope")).FindElements(By.TagName("li"));
//Click the list items that has "1st Half" as it's text.
listItems.Where(li => li.Text == "1st Half").Single().Click();

否则,如果您确定“第一半”按钮将始终排在结果的第二位(第一位是“全职”),也可以执行driver.FindElement(By.Id("bettype-tabs-scope")).FindElements(By.TagName("li"))[1].Click();

答案 1 :(得分:0)

它应该可以正常运行,因为它可以在我的机器上正常工作。也许页面加载在您的计算机上花费了时间。您可以使用预期条件等待检查元素的可见性。确保已安装了两个Selenium。 Webdriver和Selenium.Support为您的项目提供NuGet软件包。您将需要硒。支持包以使用ExpectedConditions。

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
IWebElement element = wait.Until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(),'1st') and contains(text(),'Half')]")));
element.Click();

答案 2 :(得分:0)

找到两个具有相同xpath的元素,并且第一个元素不可见。在您的代码中,您使用了FindElement方法,因此它正在查找返回错误的不可见元素。

解决方案: 您可以通过两种方式执行点击操作。

选项1:

将Xpath更改为//*[contains(text(),'1st') and contains(text(),'Half')][1]

driver.FindElement(By.XPath("//*[contains(text(),'1st') and contains(text(),'Half')][1]")).Click();

选项2:

使用FindElements方法查找所有匹配的元素,然后仅执行单击操作(如果特定元素失效)

var halfElementList = driver.FindElements(By.XPath("//*[contains(text(),'1st') and contains(text(),'Half')]"));

string html = "";
foreach(var element in halfElementList)
{
    if (element.Displayed)
    {
        element.Click();
        html = driver.PageSource;
    }
}