无法通过在Java中使用Selenium单击动态更改的div

时间:2019-02-14 22:31:44

标签: java html selenium dynamic

当我输入www.reddit.com并将查询粘贴到“搜索”字段,发送回车并转到带有subreddit的第一个有效链接时,我确实具有排序选项-默认情况下它设置为BEST,但是我想喜欢将其更改为TOP。我正在将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有效,并且元素将突出显示。我不知道我还可以做什么来对该列表进行排序。

您知道如何单击“排序”选项并使用Selenium从列表中选择“顶部”吗?


我不知道这是怎么可能的,但是我已经比较了从手动测试收集的div,并且xpath到这个元素是: /html/body/div[3]/a[2]/button 但是,当我从调试中执行相同操作(打开selenium中的浏览器)时,它指向: /html/body/div[4]/a[2]/button

所以实际上是xpath的问题,但是TBH,我不知道为什么。可以在他们的机器上尝试一下吗?

2 个答案:

答案 0 :(得分:2)

根据我的建议,您可以使用 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;
    }

问:您知道如何单击“排序”选项并使用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。

答案 1 :(得分:0)

您可以使用下面的选择器将排序选项更改为顶部:

@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;
}