无法通过在Java中使用selenium来单击动态更改div
当我进入www.reddit.com并将查询粘贴到搜索字段,发送回车并转到subreddit的第一个有效链接时,我确实有排序选项-默认情况下,它设置为“最佳”,但我想将其更改为“顶部”。我将Java与BDD和POP一起使用。以下是我的测试类代码: 公共空白顶部\u大多数顶部\u瓷砖\u将\u打印在屏幕上\u可丢弃{ redditDetailsPage.changeSorting; } 我的页面代码:无法通过在Java中使用selenium来单击动态更改div,java,html,selenium,dynamic,Java,Html,Selenium,Dynamic,当我进入www.reddit.com并将查询粘贴到搜索字段,发送回车并转到subreddit的第一个有效链接时,我确实有排序选项-默认情况下,它设置为“最佳”,但我想将其更改为“顶部”。我将Java与BDD和POP一起使用。以下是我的测试类代码: 公共空白顶部\u大多数顶部\u瓷砖\u将\u打印在屏幕上\u可丢弃{ redditDetailsPage.changeSorting; } 我的页面代码: @FindBy (id = "CommentSort--SortPicker") private
@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;
}
我相信问题在于拓扑选择xpath。我尝试按父div类或父类名称查找它,但始终得到:
org.openqa.selenium.NoSuchElementException: Unable to locate element: /html/body/div[3]/a[2]/button
我使用ExpectedConitions创建了treid,但我的代码似乎无法看到它在那里-一旦单击sortingOption。单击此div将被注入:
我还想补充一点,如果我手动执行此操作,那么此xpath是有效的,并且元素被高亮显示。我不知道我还能做些什么来整理这个列表
您知道如何单击排序选项并使用Selenium从列表中选择TOP吗
我不知道这是怎么可能的,但我已经比较了从手动测试中收集的div,xpath与这个元素是:
/html/body/div[3]/a[2]/按钮
但是,当打开selenium浏览器时,我在调试中执行了相同的操作,然后它指向:
/html/body/div[4]/a[2]/按钮
所以实际上问题在于xpath,但我不知道为什么。有些人可以在他们的机器上试用吗?根据我的建议,您可以使用Chropath,它是Chrome浏览器的一个扩展。Chropath将尝试找到合适的xpath,然后尝试使用它 请参阅更多详细信息并下载: 如果无法执行单击,请尝试使用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从列表中选择TOP吗
答:这里有一些选择选项,你可以用它来申请
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。您可以使用下面的选择器将排序选项更改为顶部:
@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;
}
XPath通常以双斜杠开始,因此请尝试//html/body/div[3]/a[2]/button'您可以显示您尝试单击的按钮的html代码吗?Timothy T.racraman:我刚开始尝试了双斜杠,但仍然是org.openqa.selenium.NoSuchElementException:现在无法找到元素://html/body/div[3]/a[2]/button,我使用了Kathlon Recorder extension[见:]这是一个用于自动测试的工具,只需单击元素,它就会自动转换为代码。您还可以选择要生成的单元测试类型[例如Junit、Nunit]我有chropath,这个xpath是由它生成的。我相信问题在于这个隐藏div的功能,因为当我单击sortingOption webelement时,整个代码都被添加了。我会尽量用你的笔记,并让你知道。@Bartek你能用Katalon录音机试试吗。它将帮助您创建脚本。您可以尝试的另一件事是查看您的路径何时发生了更改,因为您已经设置了@FindBy xpath=/html/body/div[3]/a[2]/按钮。但它被换成了另一个