即使元素存在,ExpectedConditions.ElementIsVisible也会返回TimeoutException

时间:2018-06-14 09:11:49

标签: c# selenium selenium-webdriver selenium-chromedriver webdriverwait

我正在使用Selenium ChromeDriver v2.40,Chrome版本67。

var driver = Browser.GetChromeDriver();          
driver.Navigate().GoToUrl(url);
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
var abc=driver.FindElement(By.XPath("//*[@id='pdp-size-select']"));
var aaa=wait.Until(d => d.FindElement(By.XPath("//*[@id='pdp-size-select']")));
abc.Click(); // failed because elementisnotvisible

以上两个findelement工作正常,可以获得价值,但无法点击,因为该元素不可见

所以我继续尝试ExpectedConditions,但没有运气:

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='pdp-size-select']")));

以上代码返回:

OpenQA.Selenium.WebDriverTimeoutException: 'Timed out after 10 seconds'

Chrome v67是否存在任何向后兼容性问题?

1 个答案:

答案 0 :(得分:1)

根据错误 elementisnotvisible ,您似乎非常接近。当您尝试在元素上调用 Click() 时向前移动,而不是 ExpectedConditions 而不是ElementIsVisible(),您需要使用ElementToBeClickable()如下:

new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='pdp-size-select']"))).Click();

如果没有对SeleniumExtrasWaitHelpers的任何引用,代码行将为:

new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='pdp-size-select']"))).Click();

注意:正如您所说,您正在使用 Chrome v67.x ,请确保您使用的是 ChromeDriver v2.40 (但不是 ChromeDriver v2.4

更新

进一步调试似乎已调整Locator Strategy,确定HTML DOM内的两(2)个元素。因此,您需要构建一个唯一的定位器来识别并单击所需的元素,如下所示:

new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//a[@data-track-action='Product-Page']//following::select[@id='pdp-size-select']"))).Click();

注意:所需元素为select元素,如果您希望根据最佳做法<select>元素互动,则需要使用SelectElement命名空间中的OpenQA.Selenium.Support.UI类。