Невозможно нажать на динамически изменяющийся div, используя selenium with Java - PullRequest
0 голосов
/ 15 февраля 2019

Когда я вхожу на сайт www.reddit.com и вставляю запрос в поле поиска, отправляю команду enter и перехожу к первой действительной ссылке с subreddit, у меня есть варианты сортировки - по умолчанию она установлена ​​на BEST, но я быхотел бы изменить его на ТОП.Я использую Java с BDD и POP.Вот мой код тестового класса: public void top_most_top_tile_will_be_printed_on_screen() throws Throwable { redditDetailsPage.changeSorting(); }

Код моей страницы:

@FindBy (id = "CommentSort--SortPicker")
private WebElement sortingOption;
@FindBy (xpath = "/html/body/div[3]/a[2]/button")
private WebElement topOption;

public RedditDetailsPage(WebDriver driver) {
    super(driver);
}

public RedditDetailsPage changeSorting(){
    sortingOption.click();
    topOption.click();
    return this;
}

, и я считаю, что проблема в topOption xpath.Я пытался найти его по родительскому классу div или по родительскому имени класса, но я всегда получал:

org.openqa.selenium.NoSuchElementException: Unable to locate element: /html/body/div[3]/a[2]/button

Я пробовал использовать ExpectedConitions, но, похоже, мой код не может увидеть, что он там есть.- как только я нажму sortingOption.click (), этот div будет добавлен: Div that appears after clicking

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

Знаете ли вы, как я могу нажать на параметры сортировки и выбрать TOP из списка, используя Selenium?


Я не знаю, как это возможно, но я сравнил div, собранный изручное тестирование и xpath к этому элементу было: /html/body/div[3]/a[2]/button однако, когда я сделал то же самое из отладки (когда был открыт браузер из selenium), то он указывал на: /html/body/div[4]/a[2]/button

Так что на самом деле проблема былас xpath, но TBH, я не знаю почему.Может кто-нибудь попробовать на своих машинах, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы можете использовать селекторы ниже, чтобы изменить параметры сортировки на верх:

@FindBy (id = "search-results-sort")
private WebElement sortingOption;

//@FindBy (xpath = "//a[.='Top']/button")
@FindBy (css = "a[href*='sort=top']")
private WebElement topOption;

public RedditDetailsPage(WebDriver driver) {
    super(driver);
}

public RedditDetailsPage changeSorting(){
    sortingOption.click();
    topOption.click();
    return this;
}
0 голосов
/ 15 февраля 2019

По моей рекомендации вы можете использовать Chropath , который является расширением для браузера Chrome.Chropath попытается найти подходящий xpath, затем попытайтесь использовать его

Подробнее и загрузить по адресу: https://chrome.google.com/webstore/detail/chropath/ljngjbnaijcbncmcnjfhigebomdlkcjo?hl=en

Если вы не можете выполнить щелчок, попробуйте использовать JS, см. Ниже.

Вы можете использовать JS для выполнения действия клика.[Вот метод для C #, но он почти такой же, как Java].

 public static void scrollElementToClick(IWebDriver driver, IWebElement element)
{
    IJavaScriptExecutor ex = (IJavaScriptExecutor)driver;
    ex.ExecuteScript("arguments[0].click();", element);
}

Другие вещи, по которым нельзя щелкнуть по элементу, могут исходить от элемента, который представлен на странице, но не готов к щелчку [clickable].Поэтому вы можете попытаться использовать wait , который предоставляется для ожидания элемента, прежде чем щелкнуть действие

Если вы не можете сделать это, попробуйте использовать это, чтобы проверить, когда вы хотите выполнить какое-либо действиек этому элементу.(Этот код используется для C #, но я думаю, что у вас может быть идея):

 public static bool existsElement(IWebDriver _driver,By by,int waitBySecond)
    {
        WebDriverWait wait = new WebDriverWait(_driver, new TimeSpan(0, 0,waitBySecond));



        try
        {

          // wait[wait.until] for element or search element [driver.FindElement]            
        }
        catch (WebDriverTimeoutException e)
        {
            // Timeout that set for finding element        
            return false;
        }
        catch(NoSuchElementException e)
         {   
           // there is no element in this page
           return false;
         }
        catch(Exception e)
       {  return false;
       }
        return true;
    }

В: Знаете ли вы, как я могу нажать на параметры сортировки и выбрать TOP из списка, используя Selenium?

A: Вот некоторые варианты выбора, которые вы можете применить к нему

         SelectElement changeOwnerMethodSelectedUser = new 
         SelectElement(_driver.FindElement(By.Name("selectedUser")));
                       // then select one choice from options by text appearance
                        changeOwnerMethodSelectedUser.SelectByText("Choice1");
                      // or you might choose by index like this [ Recommended - If you want to select choice by Top option]
                          changeOwnerMethodSelectedUser.SelectByIndex(3);

Примечание. Весь этот исходный код используется для C #.Пожалуйста, измените синтаксис на Java, прежде чем тестировать его.

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