【问题标题】:Hitting a JavaScript Button in Selenium - Java在 Selenium 中点击 JavaScript 按钮 - Java
【发布时间】:2018-12-08 00:13:43
【问题描述】:

我正在使用 Java 中的 Selenium 自动化一个大型项目。它一直很顺利,但我最近遇到了一个障碍。我正在尝试为 multi-select menu 提交 WebElements(见下文),然后从各自的列表中添加或删除它们,但 Selenium 很难做到这一点。

这是 HTML:

<div id="multiselect_labels_field_research_year" class="multiselect_labels">
    <div id="label_unselected_field_research_year" class="label_unselected">Available Options:</div>
    <div id="label_selected_field_research_year" class="label_selected">Selected Options:</div>
    </div>
    <div id="multiselect_available_field_research_year" class="multiselect_available">
        <select name="field_research_year_unsel" multiple="multiple" class="form-multiselect field_research_year_unsel multiselect_unsel" id="field_research_year" size="10">
            <option value="258">2016</option>
            <option value="261">2019</option>
            <option value="262">2020</option>
        </select>
    </div>
    <ul id="multiselect_btns_field_research_year" class="multiselect_btns">
        <li class="multiselect_add" id="field_research_year"><a href="javascript:;">Add</a></li>
        <li class="multiselect_remove" id="field_research_year"><a href="javascript:;">Remove</a></li>
    </ul>
    <div class="form-item form-type-select form-item-field-research-year-und">
        <label for="edit-field-research-year-und">Research Year </label>
            <select class="field_research_year_sel multiselect_sel form-select" id="field_research_year" multiple="multiple" name="field_research_year[und][]" size="10">
                <option value="258">2016</option><option value="261">2019</option>
                <option value="262">2020</option><option value="259" selected="selected">2017</option>
                <option value="260" selected="selected">2018</option>            
            </select>
    </div>

我可以很好地找到并单击菜单项,但是添加或删除变得很痛苦。首先,我在 HTML 中找到了“添加”和“删除”(绿色和红色按钮)的 WebElements,并尝试使用 Selenium 的 .click() 单击它,我收到一条错误消息,提示

“元素 [...] 在 (329, 19) 处不可点击。”

当我尝试单击链接部分(将“

for (WebElement we : yearButtonsRemove.getOptions()) {
    System.out.println(we.getText());
    we.click();
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("arguments[0].scrollIntoView()", yearDel);
    jse.executeScript("arguments[0].click()", yearDel);
}

for (WebElement we : yearButtons.getOptions()) {
    if (we.getText().equals("2018") || we.getText().equals("2019")) {
        we.click();
        JavascriptExecutor jse = (JavascriptExecutor)driver;
        jse.executeScript("arguments[0].scrollIntoView()", yearAdd);
        jse.executeScript("arguments[0].click()", yearAdd);
    }
}

但是现在没有出现错误或跟随不相关的链接,而是没有任何反应。列表中正确的元素被选中,但使用 JavaScript “单击”按钮什么都不做。

【问题讨论】:

    标签: javascript java html selenium


    【解决方案1】:

    根据异常类型,可以通过如下点击方法解决:

    Actions builder = new Actions(driver);
    builder.MoveToElement("Your target element").click().Perform();
    

    【讨论】:

    • 无论出于何种原因,这只是单击页面上的第一个 Javascript 元素,然后将我带到页面顶部的另一个链接。
    • 那么你的目标是什么?
    • 我的目标是绿色的“mutliselect_add”按钮,但是当我使用该代码时,正在单击网页右上角的设置按钮(我已经执行了许多测试来制作确保传入的网络元素是正确的)。
    【解决方案2】:

    您可以在不使用 JavaScript Executor 的情况下实现您的方案,如下所示

    1. 如下创建两个函数addResearchYearremoveResearchYear
    2. 如果需要添加年份,可以通过传递驱动实例和年份调用addResearchYear方法实现
    3. 如果需要删除某个年份,则只需传递驱动程序实例和年份即可调用removeResearchYear 方法。

    代码:

       public void addResearchYear(WebDriver driver,String year){
        //you can add the element list from Available List option. Adding can be done as below without using the JavaScript Executor
        WebElement availableOptions=driver.findElement(By.name("field_research_year_unsel"));
        Select select=new Select(availableOptions);
        select.selectByVisibleText(year);
    
        WebDriverWait wait=new WebDriverWait(driver,20);
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class='multiselect_add']/a")));
        driver.findElement(By.xpath("//li[@class='multiselect_add']/a")).click();
    }
    
    public void removeResearchYear(WebDriver driver,String year){
        WebElement selectedOptions=driver.findElement(By.xpath("//select[@class='field_research_year_sel multiselect_sel form-select']"));
        Select select=new Select(selectedOptions);
        select.selectByVisibleText(year);
    
        WebDriverWait wait=new WebDriverWait(driver,20);
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class='multiselect_remove']/a")));
        driver.findElement(By.xpath("//li[@class='multiselect_remove']/a")).click();
    }
    

    【讨论】:

    • 这给出了一个“未知错误:元素 ... 在点 (326, 19) 是不可点击的。其他元素会收到点击: ..." 具有讽刺意味的是,“/admin/config”正是我使用 Action 对象尝试单击按钮时获取的 URL。
    • 您可以在执行点击操作之前添加显式等待。我已经更新了答案并将添加/删除元素定位器从类名更改为 XPath
    • 所以,xpath 是不可定位的。当我传入已经为 WebElement 制作的对象时,我收到以下消息: Element
    • ...
    • is not clickable at point (326, 19)。其他元素会收到点击:... 奇怪的是,“removed-processed”不会出现在源代码的任何地方!
  • 使用更新后的代码是否出现同样的错误?
  • 不幸的是,是的。我认为附加到此按钮的 JavaScript 导致了一些挂断,并使 Selenium 认为它需要运行附加到 的第一件事
  • 【解决方案3】:

    好的,无论出于何种原因,这只是 ChromeDriver 的问题。它一直忽略路径等,根本不允许与包装在 .我切换到了 FireFox,Selenium 从此没有任何问题。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签