Если драйвер Selenium не находит движущийся элемент (если - еще, если), то он выдает ошибку «Не найти элемент» - PullRequest
0 голосов
/ 26 октября 2019

Короче говоря - у меня есть кнопка, которая не имеет идентификаторов и имеет составной класс (поэтому селен ненавидит его / не может его найти). Поэтому я использую селектор XPath, который прекрасно работает

driver.findElement(By.xpath("//input[@value='Continue to Payment']")).click()

Но кнопка меняется в зависимости от используемого языка.

Так что на данный момент у меня есть

if (driver.findElement(By.xpath("//input[@value='Continue to Payment']")).isDisplayed()){ 
           driver.findElement(By.xpath("//input[@value='Continue to Payment']")).click();
    }

else if (driver.findElement(By.xpath("//input[@value='Paiement']")).isDisplayed()){           
        driver.findElement(By.xpath("//input[@value='Paiement']")).click();
    }

else if ( same thing as above but for another language)

Но когда Selenium выдает ошибку после прохождения первого оператора if с:

no such element: Unable to locate element:{"method":"xpath","selector":"//a[contains(text(),'Checkout')]"}

Я знаю, что элементне там .. так что я не хочу, чтобы он что-то делал и переходил к следующему оператору if else. Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Вы можете использовать отдельные короткие методы для достижения ожидаемых результатов и регистрации ошибок.

public WebElement getElement(WebDriver driver, String XPATH, int timeoutInSeconds){
    WebElement elem = null;
    try{
        WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
        elem = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(XPATH));
    } catch (Exception e){
        // log or print error.
    }
    return elem;
}

Затем вы можете назвать его как

WebElement e = getElement(driver, "//input[@value='Continue to Payment']", 10); 
if (e != null) {
    e.click();
} else {
  e = getElement(driver, "//input[@value='Paiement']", 5);
  if (e != null) {
    e.click();
  } /// and so on....
}

Таким образом, вы можете настроить время ожидания длякаждый элемент, а также не попадать в ошибки, если какой-либо один элемент отсутствует из-за языка.

0 голосов
/ 26 октября 2019
try {
            if (driver.findElement(By.xpath("//input[@value='Continue to Payment']")).isDisplayed()){
                driver.findElement(By.xpath("//input[@value='Continue to Payment']")).click();
            }

            else if (driver.findElement(By.xpath("//input[@value='Paiement']")).isDisplayed()){
                driver.findElement(By.xpath("//input[@value='Paiement']")).click();
            }
            else
                System.out.println("Button not found");

        } catch(NoSuchElementException | StaleElementReferenceException e) {
            System.out.println("Impossible to click the pop-up. Reason: " + e.toString());
        }

Попробуйте вышеуказанное решение, надеюсь, оно будет работать для вас. В вашем примере был написан неправильный код для else if (driver.findElement(By.xpath("//input[@value='Paiement']")).isDisplayed).

...