Невозможно нажать на указанный элемент li - PullRequest
1 голос
/ 24 февраля 2020

Мне нужно нажать на указанный элемент li, используя раскрывающийся список: All subject areas на веб-сайте . Проблема в том, что невозможно нажать на указанный элемент li с помощью Selenium.

Например, если я пишу так:

 String textInput = "Agricultural and Biological Sciences";  

 //...

 // open the dropdown so the options are visible
 driver.findElement(By.className("dropdown"));

 // Get all of the options of dropdown list
 WebElement ulElement  = driver.findElement(By.cssSelector("ul.dropdown-options.dropdown-element"));
 List<WebElement> opts = ulElement.findElements(By.xpath(".//li/a"));

И пытаюсь выбрать указанный элемент li:

// Loop through the options and select the one that matches
        for (WebElement opt : opts) {
            if(opt.getText().equals(textInput)){
               opt.click();
               //...
            }
        }

Программа просто пропускает условие.

Если я изменил вариант на следующий:

  // Loop through the options and select the one that matches
        for (WebElement opt : opts) {
            if(!opt.findElements(By.xpath("//*[contains(text(), '" + textInput + "')]")).isEmpty()) {
                opt.click();
                //...
            }
        }

Условие не игнорируется и успешно проходит, но затем программа не нажимает на кнопку, и список закрывается.

Может кто-нибудь подсказать мне, как решить проблему здесь?

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

К click() на элементе с текстом Сельскохозяйственные и биологические науки (разные) из раскрывающегося списка необходимо вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать следующие Стратегии локатора :

  • xpath :

    driver.navigate().to("https://www.scimagojr.com/journalrank.php?country=UA&page=1");
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[normalize-space()='All subject areas']"))).click();
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[normalize-space()='All subject areas']//following-sibling::ul[1]//li/a[normalize-space()='Agricultural and Biological Sciences']"))).click();
    
  • Снимок браузера:

scimagojr

1 голос
/ 24 февраля 2020

Во-первых, чтобы появилось li, вам нужно щелкнуть этот элемент:

driver.findElement(By.className("dropdown")).click();

Во-вторых, вам нужно добавить wait после нажатия и добавить оператор break в l oop:

String textInput = "Agricultural and Biological Sciences";

WebElement ulElement  = driver.findElement(By.cssSelector("ul.dropdown-options.dropdown-element"));
List<WebElement> opts = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfNestedElementsLocatedBy(ulElement, By.xpath(".//li/a")));

//here, before click, just make sure your `li` printed all the text
for(WebElement opt :opts) {
    System.out.println("get text : " +opt.getText());
}

for (WebElement opt : opts) {
    if(opt.getText().equals(textInput)){
        opt.click();
        //here
        break;
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...