当我输入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被注入了:
我还要补充一点,如果我手动执行此操作,则此xpath有效,并且元素将突出显示。我不知道我还可以做什么来对该列表进行排序。
您知道如何单击“排序”选项并使用Selenium从列表中选择“顶部”吗?
我不知道这是怎么可能的,但是我已经比较了从手动测试收集的div,并且xpath到这个元素是:
/html/body/div[3]/a[2]/button
但是,当我从调试中执行相同操作(打开selenium中的浏览器)时,它指向:
/html/body/div[4]/a[2]/button
所以实际上是xpath的问题,但是TBH,我不知道为什么。可以在他们的机器上尝试一下吗?
答案 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;
}