Selenium webdriver 由于元素不可见,selenium web驱动程序无法单击下一步按钮

Selenium webdriver 由于元素不可见,selenium web驱动程序无法单击下一步按钮,selenium-webdriver,Selenium Webdriver,我正在尝试对web表单进行自动化测试,该表单有三个页面,每个页面都有一个“下一步”按钮 以下是HTML: <div id="Section1Page" class="field fieldgroup bus-form-page nolabel" style="display: block;"> <div class="middleColumn fieldgroup"> <input class="prev" type="button" value="P

我正在尝试对web表单进行自动化测试,该表单有三个页面,每个页面都有一个“下一步”按钮

以下是HTML:

    <div id="Section1Page" class="field fieldgroup bus-form-page nolabel" style="display: block;">
<div class="middleColumn fieldgroup">
   <input class="prev" type="button" value="Previous" style="display: none;">
   <input class="next" type="button" value="Next">
</div>
<div id="Section2Page" class="field fieldgroup bus-form-page nolabel" style="display: none;">
<div class="middleColumn fieldgroup">
<div class="fieldgroup-field first odd">
<div class="fieldgroup-field even">
<div class="fieldgroup-field odd">
<div class="fieldgroup-field even">
<div class="fieldgroup-field odd">
   <div class="fieldgroup-field last even">
      <div class="fieldholder-small">
      </div>
   </div>
   <input class="prev" type="button" value="Previous">
   <input class="next" type="button" value="Next">
</div>
但是在section 2页面上,当我执行click时,I get元素当前不可见,因此可能无法与之交互


请帮忙

您应该使用
ExpectedCondition
elementlocated的可见性
而不是
presenceOfElementLocated

WebDriverWait wait = new WebDriverWait(driver, 30);   
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("Form_Form_Addition‌​alInformation"))).sendKeys("12345");

您应该使用
ExpectedCondition
elementlocated的可见性
,而不是
presenceOfElementLocated

WebDriverWait wait = new WebDriverWait(driver, 30);   
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("Form_Form_Addition‌​alInformation"))).sendKeys("12345");

在这种情况下,您应该尝试使用
JavaScriptExecutor
,如下所示:-

WebDriverWait wait = new WebDriverWait(driver, 30);   
WebElement el = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("Form_Form_Addition‌​alInformation")));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].value = arguments[1]", el, "12345");
 List<WebElement> buttons = driver.findElements(By.className("next"));

 for (WebElement button : buttons) {
         If(button. isDisplayed()) {
                button. click();
          }
  }
已编辑:-如果您有多个
下一步
按钮,并且您希望找到所有按钮,并通过检查其可见性来单击
以查看按钮,然后尝试以下操作:-

WebDriverWait wait = new WebDriverWait(driver, 30);   
WebElement el = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("Form_Form_Addition‌​alInformation")));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].value = arguments[1]", el, "12345");
 List<WebElement> buttons = driver.findElements(By.className("next"));

 for (WebElement button : buttons) {
         If(button. isDisplayed()) {
                button. click();
          }
  }
List buttons=driver.findElements(By.className(“next”);
用于(WebElement按钮:按钮){
If(button.isDisplayed()){
按钮。单击();
}
}
注意:-我建议您首先尝试使用
元素定位的可见性
,而不是
元素定位的呈现
,并且可以直接使用
发送键
作为
等待.until(预期条件.元素定位的呈现(按.id)(“表单\表单\添加‌​电话号码("12345);
,如果仍然出现异常,请尝试使用
JavascriptExecutor
作为第二个选项


希望它能帮助您:)

在这种情况下,您应该尝试使用
JavaScriptExecutor
,如下所示:-

WebDriverWait wait = new WebDriverWait(driver, 30);   
WebElement el = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("Form_Form_Addition‌​alInformation")));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].value = arguments[1]", el, "12345");
 List<WebElement> buttons = driver.findElements(By.className("next"));

 for (WebElement button : buttons) {
         If(button. isDisplayed()) {
                button. click();
          }
  }
已编辑:-如果您有多个
下一步
按钮,并且您希望找到所有按钮,并通过检查其可见性来单击
以查看按钮,然后尝试以下操作:-

WebDriverWait wait = new WebDriverWait(driver, 30);   
WebElement el = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("Form_Form_Addition‌​alInformation")));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].value = arguments[1]", el, "12345");
 List<WebElement> buttons = driver.findElements(By.className("next"));

 for (WebElement button : buttons) {
         If(button. isDisplayed()) {
                button. click();
          }
  }
List buttons=driver.findElements(By.className(“next”);
用于(WebElement按钮:按钮){
If(button.isDisplayed()){
按钮。单击();
}
}
注意:-我建议您首先尝试使用
元素定位的可见性
,而不是
元素定位的呈现
,并且可以直接使用
发送键
作为
等待.until(预期条件.元素定位的呈现(按.id)(“表单\表单\添加‌​电话号码("12345);
,如果仍然出现异常,请尝试使用
JavascriptExecutor
作为第二个选项


希望它能帮助您……:)

在尝试单击之前添加一些等待时间。可能您的页面尚未完全加载。是的,我已经通过(new WebDriverWait(driver,30))完成了。直到(ExpectedConditions.presenceOfElementLocated(by.id(“Form_Form_AdditionalInformation”))。sendKeys(“12345”);separate命令分隔行并确保它实际等待。也许一步一步地做,在你尝试点击之前,增加一些等待时间。可能您的页面尚未完全加载。是的,我已经通过(new WebDriverWait(driver,30))完成了。直到(ExpectedConditions.presenceOfElementLocated(by.id(“Form_Form_AdditionalInformation”))。sendKeys(“12345”);separate命令分隔行并确保它实际等待。可能是stepHi一步一步地做我尝试了你的建议,它确实在文本区域输入了12345,但是当它尝试单击下一步按钮:driver.findElement(by.className(“next”)。单击时,它返回org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能不会与错误交互。我一直在想,它是否可以尝试单击第一页上的“下一步”按钮,而不是当前的第二页?我如何找到整个表单上的所有按钮,然后一个接一个地单击它们,直到一个按钮可见并可单击?谢谢您的帮助。您好,我尝试了您的建议,它确实在文本区域中输入了12345,但当它尝试单击下一步按钮:driver.findElement(By.className(“下一步”)。单击时,它返回org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与错误交互。我一直在想,它是否可以尝试单击第一页上的“下一步”按钮,而不是当前的第二页?我如何找到整个表单上的所有按钮,然后一个接一个地单击它们,直到一个按钮可见并可单击?谢谢您的帮助。您好,我尝试了您的建议,它确实在文本区域中输入了12345,但当它尝试单击下一步按钮:driver.findElement(By.className(“下一步”)。单击时,它返回org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与错误交互。我一直在想,它是否可以尝试单击第一页上的“下一步”按钮,而不是当前的第二页?我如何找到整个表单上的所有按钮,然后一个接一个地单击它们,直到一个按钮可见并可单击?谢谢您的帮助。@Tony然后使用
driver.findElements(By.className(“next”))
…如果
WebElement
,它将返回
List
…使用
isDisplayed()
迭代此列表并查找可见按钮。非常感谢您的帮助,它现在可以工作了。非常感谢。感谢大家的帮助。您好,我尝试了您的建议,它确实在文本区域输入了12345,但当它尝试单击下一步按钮:driver.findelelement(By.className(“next”)。单击时,它返回org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能不会与错误交互。我一直在想,它是否可以尝试单击第一页上的“下一步”按钮,而不是当前的第二页?我如何找到整个表单上的所有按钮,然后一个接一个地单击它们,直到一个按钮可见并可单击?谢谢您的帮助。@Tony然后使用
driver.findElements(By.className(“next”))
…如果
WebElement
,它将返回
List
…使用
isDisplayed()
迭代此列表并查找可见按钮。