#java #selenium #selenium-webdriver #selenium-chromedriver #cucumber
Вопрос:
Я попытался использовать явное ожидание, ожидаемые условия.elementToBeClickable и waitForVisibleElement, но это заканчивается тайм-аутом и ожиданием, когда элемент станет доступным для кликабельности.
Я также попытался получить разные локаторы (разные div). Вот мой код (и те, которые я пробовал)
public void setSystemInformationSection() throws Exception {
scrollPageDownBy800();
//wait.until(ExpectedConditions.elementToBeClickable(INVERTERMANUFACTURERDRPDWN));
//click(INVERTERMANUFACTURERDRPDWN, "INVERTERMANUFACTURERDRPDWN;");
//click(INVERTERMANUFACTURERDRPDWN, "INVERTERMANUFACTURERDRPDWN;");
//waitForVisibleElement(driver, SMACORE1OPTION); click(SMACORE1OPTION,"SMACORE1OPTION");
Boolean wait = new WebDriverWait(driver,20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id="SMA - Core1"]")));
jse.executeScript("arguments[0].click()", INVERTERMANUFACTURERDRPDWN);
//waitForVisibleElement(driver, SMACORE1OPTION);
jse.executeScript("arguments[0].click()", SMACORE1OPTION);
}
Другие выпадающие списки, которые я пробовал, отлично работали с последним фрагментом кода (те, которые не были закомментированы).
Я попробовал это с другим раскрывающимся списком, и это сработало нормально
public void setCommercialDealType() throws Exception {
Boolean wait = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("/html/body/app-root/ng-component/commercial-create-account/main/section[2]/opportunity-information/form/div[2]/div[1]/sp-dropdown/div/div/div[2]/ul/li[2]")));
jse.executeScript("arguments[0].click()", COMMERCIALDEALTYPEDROPDOWN);
waitForVisibleElement(driver, COMMERCIALHELIXPPA);
jse.executeScript("arguments[0].click()", COMMERCIALHELIXPPA);
}
Когда я пытаюсь проверить с помощью IsEnabled или isDisplayed, это выдает ошибку тайм-аута. Я застрял.
Комментарии:
1. Можете ли вы поделиться URL-адресом страницы, которую вы пытаетесь автоматизировать, или вы можете добавить HTML-код части страницы, которую вы пытаетесь автоматизировать, в вопросе выше.
Ответ №1:
Иногда элемент виден или доступен для вас, но разделители или промежутки (или другие элементы) скрывают его с точки зрения Селена. Чтобы преодолеть это:
- Сначала вы находите элемент по идентификатору, xpath или Css-выражению.
- Попробуйте перейти к элементу (сфокусируйтесь на нем) с помощью Selenium, а затем щелкните его.
- Если шаг 2 не удался — просто выполните элемент.нажмите
- если шаг 3 не удался — сделайте жесткий щелчок с помощью JavaScript:
Пример кода:
public void clickLastFoundElement() {
try {
Actions builder = new Actions(browser);
builder.moveToElement(lastFoundElement).click().build().perform();
} catch (ElementNotInteractableException x1) {
try {
lastFoundElement.click();
}
catch (Exception x2) {
hardClickElement();
}
}
}
private void hardClickElement() {
JavascriptExecutor executor = (JavascriptExecutor) browser;
executor.executeScript("arguments[0].click();", lastFoundElement);
}
Комментарии:
1. Я действительно все это сделал, число 4 проходит тест, но на самом деле оно ни на что не нажимает.
2. Таким образом, элемент на самом деле не доступен для клика, он отключен.
3. Он доступен для кликабельности. Я обнаружил кое-что при тестировании, когда я выбираю опцию на странице выше, выпадающий список становится недоступным. Но когда я оставляю его по умолчанию, он щелкает по элементу. Может быть, xpath движется? Я действительно заблудился.
4. Не ждите, пока элемент станет невидимым, ждите, пока он будет доступен или доступен для клика. Если что — то не получается- заверните это в блок try and catch. В блоке catch попробуйте снова найти элемент, возможно, страница сильно изменилась, а вместе с ней и DOM…
5. Я нашел проблему. 2 элемента имеют одинаковые пути xpath. Добавление «[2] » не работает, какие-нибудь советы?