ExpectedConditions.ElementIsVisible returns TimeoutException 即使存在元素
ExpectedConditions.ElementIsVisible returns TimeoutException even when element is present
我正在使用 Selenium Chrome驱动程序 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']")));
以上代码returns:
OpenQA.Selenium.WebDriverTimeoutException: 'Timed out after 10 seconds'
它与 Chrome v67 有任何向后兼容性问题吗?
根据错误 elementisnotvisible 看来你已经很接近了。当您尝试在元素上调用 Click()
时继续前进,因此您需要 ExpectedConditions 而不是 ElementIsVisible()
使用 ElementToBeClickable()
如下:
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='pdp-size-select']"))).Click();
没有对 SeleniumExtras
和 WaitHelpers
的任何引用,代码行将是:
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)
更新
进一步调试似乎 you have adapted, identifies exactly two (2) elements within the HTML DOM。所以你需要构造一个唯一的定位器来识别和点击所需的元素,如下所示:
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 Class from OpenQA.Selenium.Support.UI 命名空间。
我正在使用 Selenium Chrome驱动程序 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']")));
以上代码returns:
OpenQA.Selenium.WebDriverTimeoutException: 'Timed out after 10 seconds'
它与 Chrome v67 有任何向后兼容性问题吗?
根据错误 elementisnotvisible 看来你已经很接近了。当您尝试在元素上调用 Click()
时继续前进,因此您需要 ExpectedConditions 而不是 ElementIsVisible()
使用 ElementToBeClickable()
如下:
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='pdp-size-select']"))).Click();
没有对 SeleniumExtras
和 WaitHelpers
的任何引用,代码行将是:
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)
更新
进一步调试似乎
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 Class from OpenQA.Selenium.Support.UI 命名空间。