我正在使用Selenium
从网站上下载一些数据,特别是url。
如您所见,有两个标签:
我正在尝试通过模拟通过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
的结构也是正确的。
发生了什么事?
答案 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 Time</span></strong></li>
<li class=""><a onmousedown="uid(28)._onClick();return false;" title="1st Half" href=""><span>1st Half</span></a></li>
<li class="last"><a onmousedown="uid(29)._onClick();return false;" title="2nd Half" href=""><span>2nd 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;
}
}