Как работать с выпадающим меню на сайте Phptravels.net с использованием селена - PullRequest
0 голосов
/ 02 июля 2018

У меня есть большая проблема с ручкой с выпадающим меню на сайте https://www.phptravels.net/.

Я написал этот тест, но он не работает, и я не представляю, как это сделать правильно.

public class HomePage {

    private Logger logger = LogManager.getRootLogger();

    @FindBy(xpath = "//*[@id=\"li_myaccount\"]/ul")
    private WebElement dropDownMenu;

    @FindBy(xpath = "//*[@id=\"li_myaccount\"]/ul/li")
    private WebElement dropDownMenuOptions;

    public HomePage() {
        PageFactory.initElements(DriverManager.getWebDriver(), this);
    }

    public void clickOnMyAccountDropMenuAndSelectOption(String option) {
        WaitForElement.waitUntilElementIsVisible(dropDownMenu);
        dropDownMenu.click();

        List<WebElement> options = DriverManager.getWebDriver().findElements(By.xpath("//*[@id=\"li_myaccount\"]/ul/li"));

        for(WebElement o: options) {
            if(o.getText().equals(option)) {
                o.click();
                return;
            }
        }   
    }

    public void clickOnLoginLink() {
        WaitForElement.waitUntilElementIsClickable(loginLink);
        loginLink.click();
        logger.info("Clicked on Login link");
    }
}

Мой вопрос заключается в том, как мне изменить метод clickOnMyAccountDropMenuAndSelectOption, чтобы сделать тест корректным? Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вам нужно изменить некоторые из локаторов :

Всегда полезно использовать css selector over xpath .

Для этого:

  @FindBy(xpath = "//*[@id=\"li_myaccount\"]/ul")
   private WebElement dropDownMenu;  

Используйте это:

@FindBy(css= "li#li_myaccount>a[aria-expanded]")
private WebElement dropDownMenu;  

Для этого:

@FindBy(xpath = "//*[@id=\"li_myaccount\"]/ul/li")
private WebElement dropDownMenuOptions;  

Используйте это:

@FindBy(css= "div#collapse ul.navbar-right li#li_myaccount li>a")
private WebElement dropDownMenuOptions;  

И в этом методе используйте это как:

List<WebElement> options = DriverManager.getWebDriver().findElements(By.cssSelector("div#collapse ul.navbar-right li#li_myaccount li>a"));

for(WebElement o: options) {
  if(o.getText().trim().contains("Login")) {
                o.click();
            }
        }   
0 голосов
/ 02 июля 2018

Попробуйте это:

public class HomePage {

  private Logger logger = LogManager.getRootLogger();

  @FindBy(xpath = "//nav//*[@id='li_myaccount']/a")
  private WebElement dropDownMenu;

  @FindBy(xpath = "//nav//*[@id='li_myaccount']/ul/li/a")
  private WebElement dropDownMenuOptions;

  public HomePage() {
    PageFactory.initElements(DriverManager.getWebDriver(), this);
  }

  public void clickOnMyAccountDropMenuAndSelectOption(String option) {
    WaitForElement.waitUntilElementIsVisible(dropDownMenu);
    dropDownMenu.click();

    Thread.sleep(2000); // wait 2 seconds until dropdown loads
    List<WebElement> options = DriverManager.getWebDriver().findElements(By.xpath("//nav//*[@id='li_myaccount']/ul/li/a"));

    for(WebElement o: options) {
      if(o.getText().equals(option)) {
        o.click();
        return;
      }
    }
  }

  public void clickOnLoginLink() {
    WaitForElement.waitUntilElementIsClickable(loginLink);
    loginLink.click();
    logger.info("Clicked on Login link");
  }
}

Ваши xPaths были неверны. Я исправил их.

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