ExpectedConditions.ElementIsVisible возвращает TimeoutException, даже если элемент присутствует

Я использую 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

два вышеуказанных элемента поиска работают нормально, могут получать значение, но не могут щелкнуть, потому что элемент не отображается

поэтому я продолжаю пробовать ExpectedConditions, и с этим мне не повезло:

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

Приведенный выше код возвращает:

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

Есть ли у него проблемы с обратной совместимостью с Chrome v67?


person nam vo    schedule 14.06.2018    source источник
comment
Попробуйте использовать Thread.sleep (); Независимо от того, работает он или нет, нет зависимости от ChromeDriver   -  person Ishita Shah    schedule 14.06.2018
comment
спасибо, я дал ему 30 секунд спать, но он не работает. У меня такие же ситуации давным-давно, и пока нет реальных решений для них. не знаю почему.   -  person nam vo    schedule 14.06.2018
comment
Убедитесь, что веб-страница правильно перенаправлена ​​и полностью загружена. Кроме того, вы можете выполнить трассировку стека с помощью отладчика.   -  person Ishita Shah    schedule 14.06.2018
comment
да, полностью загружен. сайт загружается очень быстро.   -  person nam vo    schedule 14.06.2018


Ответы (1)


В соответствии с ошибкой 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)


Обновлять

Дальнейшая отладка кажется, что адаптированная вами стратегия локатора определяет ровно два (2) элемента в 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 Класс из OpenQA.Selenium.Support.UI пространство имен.

person DebanjanB    schedule 14.06.2018
comment
Можете ли вы обновить вопрос с помощью соответствующего HTML? - person DebanjanB; 14.06.2018
comment
это 6pm.com / p / us-polo-assn-stretch-pique-dot-print-polo-shirt / на сайте Amazon. - person nam vo; 14.06.2018
comment
на самом деле мой настоящий код - это driver.FindElement (By.XPath (// * [@ id = 'pdp-size-select'])) [0] .Click); но почему-то первый элемент не виден и не доступен для клика. - person nam vo; 17.06.2018