Selenium:submit()工作正常,但click()没有

时间:2017-12-27 12:51:54

标签: java selenium selenium-webdriver junit

我有提交按钮,它只是页面上的一个,而且它的形式。

html部分:

<form class="search-form ng-touched ng-dirty ng-valid" novalidate="" style="" xpath="1">

<div class="row">...</div>
<div class="row">...</div>
<div class="row">...</div>
<div class="form__actions" xpath="1">
    <div class="form__buttons">
      <!---->
      <div class="btn__wrapper">
        <button class="btn btn__primary" type="submit">
          Select My Car
        </button>
      </div>
    </div>
  </div>

</form>

所以,我采取xpath:

//button[@type='submit']

我通过submit()成功按下它(让我跳过WebDriver init,很好):

  WebElement searchButton = driver.findElement(By.xpath("//button[@type='submit']"));
  searchButton.submit();

(和一些搜索执行)

但是当我试图通过点击()

按下它时
WebElement searchButton = driver.findElement(By.xpath("//button[@type='submit']"));
        searchButton.click();

它没有在启动的浏览器中按下,同时Junit测试为绿色(不是测试,只是按下按钮):

@Test
    public void test() {
        WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));
        button.click();
    }

可以请某人解释一下,为什么在这种情况下提交()成功按下按钮,但点击() - 否。我不明白,为什么&#34;测试&#34;当我们尝试点击()时,它是绿色的,但如果查看驱动程序启动的浏览器,则不会执行。

更新: 我试过了

WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));
        if (button.isEnabled()) {
            button.click();
        }

WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(button)).click();

但仍然相同 - submit()工作正常,点击() - 没有。

4 个答案:

答案 0 :(得分:5)

方法object.submit()用于将表单提交给服务器。如果您无法找到&#34;提交&#34;它还有另一个优点。按钮然后你可以采取窗体的任何对象并触发submit()函数。 它似乎在searchButton.submit();中,searchButton是表单的一个元素,对它的提交操作会触发在服务器上提交表单。

现在,为什么searchButton.click();无法在这里工作可能有以下原因。

  1. 按钮可见但未启用。
  2. 司机正在寻找2 searchButton元素的实例。
  3. 建议:评估以下代码并检查它是否返回多个元素。如果是,那么你就点击了错误的实例。

    List<WebElements> e = driver.findElements(By.xpath("//button[@type='submit']"));
    

    也试试,

    driver.findElement(By.xpath(".//button[@class='btn btn__primary'][@type='submit']")).click()
    

    http://docs.seleniumhq.org/docs/03_webdriver.jsp#user-input-filling-in-forms

答案 1 :(得分:1)

submit()

submit()方法定义为:

void submit()

Throws:
NoSuchElementException - If the given element is not within a form

根据JavaDocssubmit()上调用 WebElement 时,如果此当前元素是表单或表单中的元素,则这将被提交给远程服务器。如果这导致当前页面发生更改,则此方法将阻塞,直到加载新页面。

click()

click()方法定义为:

void click()

Throws:
StaleElementReferenceException - If the element no longer exists as initially define

根据JavaDocsclick()上调用 WebElement 时,如果这会导致加载新页面,则应放弃对此的所有引用元素和对此元素执行的任何进一步操作都将抛出StaleElementReferenceException。请注意,如果通过发送本机事件(这是大多数浏览器/平台上的默认设置)完成click(),则该方法将等待下一页加载,并且调用者应验证自己。要点击的元素有一些 ExpectedConditions 。该元素必须可见,且必须为heightwidth 大于0

您的用例:

在您的用例中,目标WebElement //button[@type='submit'] 位于 <form> 标记内。您可以通过 submit() 成功按下它,因为它会阻止该方法,直到新网页因上一页提交而完全加载。因此,以下工作:

WebElement searchButton = driver.findElement(By.xpath("//button[@type='submit']"));
searchButton.submit();

但是当您尝试如下的 click() 方法时,click()作为本机事件并不等待新页面完全加载。因此,调用click()方法失败。

WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));
button.click();

您的代码审判:

验证 button.isEnabled() 条件,如果该元素可点击,则无法获取所需的结果,因为isEnabled()验证Is the element currently enabled or not? This will generally return true for everything leaving out the disabled input elements。但必须 isEnabled() 才能验证WebElement可见可互动是否可点击

解决方案:

根据提供的详细信息,调用 click() 方法的解决方案是使用WebDriverWait子句设置 ExpectedConditions elementToBeClickable如下:

new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@type='submit']"))).click();

更新:

最佳实践:

根据更新后的HTML以及您之后提到的有关在您的应用中使用Angular4的评论,一种更有效的方法是构建xpath模拟HTML DOM 1}}如下:

new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//form[@class='search-form ng-touched ng-dirty ng-valid']//button[@class='btn btn__primary' and @type='submit']"))).click();

答案 2 :(得分:0)

我找到了一些相关的帖子,你可能想要查看它们,如果你还没有:

click on submit button not working in selenium webdriver

How can i click submit button

Selenium Webdriver submit() vs click()

也尝试使用css:

driver.findElement(By.cssSelector(".btn.btn__primary")).click();

答案 3 :(得分:-1)

  

我不明白,为什么“test”是绿色的,当我们尝试点击()时,如果查看由驱动程序启动的浏览器,它就没有执行。

click()不起作用时,不会抛出任何错误,并且测试方法正常完成。这导致测试保持绿色。通常,测试应该具有一个或多个“断言”,以验证在测试期间应发生的某些情况。您应该在单击按钮后添加断言以验证按钮单击应该执行的操作。如果断言失败,则测试将为红色。

P.S。我也对你问题的另一部分感到困惑。我不明白为什么submit()有效,但click()没有。