Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过在Java中使用selenium来单击动态更改div_Java_Html_Selenium_Dynamic - Fatal编程技术网

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

无法通过在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

当我进入www.reddit.com并将查询粘贴到搜索字段,发送回车并转到subreddit的第一个有效链接时,我确实有排序选项-默认情况下,它设置为“最佳”,但我想将其更改为“顶部”。我将Java与BDD和POP一起使用。以下是我的测试类代码: 公共空白顶部\u大多数顶部\u瓷砖\u将\u打印在屏幕上\u可丢弃{ 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;
}
我相信问题在于拓扑选择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]/按钮。但它被换成了另一个