【问题标题】:Unable to click on a popup button in selenium webdriver with java无法使用 java 单击 selenium webdriver 中的弹出按钮
【发布时间】:2016-09-13 10:51:41
【问题描述】:

我的 HTML

<div id="981bdff3-90a1-4966-ada9-6550b5a963bc" class="modal bootstrap-dialog  type-primary fade size-normal in" aria-hidden="false" role="dialog" aria- labelledby="981bdff3-90a1-4966-ada9-6550b5a963bc_title" tabindex="-1"  style="display: block; padding-right: 17px;">
<div class="modal-backdrop fade in" style="height: 351px;"></div>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<div class="bootstrap-dialog-header">
<div class="bootstrap-dialog-close-button" style="display: none;">
<button class="close">×</button>
</div>
<div id="981bdff3-90a1-4966-ada9-6550b5a963bc_title" class="bootstrap-dialog-title">Are you sure?</div>
</div>
</div>
<div class="modal-body">
<div class="bootstrap-dialog-body">
<div class="bootstrap-dialog-message">You will lose all data !</div>
</div>
</div>
<div class="modal-footer" style="display: block;">
<div class="bootstrap-dialog-footer">
<div class="bootstrap-dialog-footer-buttons">
<button id="1b0400a9-c69b-429f-9bdd-11112b7cb3a4" class="btn btn-default">Cancel</button>
<button id="3e4fec25-9538-4351-92b1-c7f9f8ce9574" class="btn btn-primary">OK</button>
</div>
</div>
</div>
</div>
</div>

我的 Java

package Modules;

import java.util.Iterator;
import java.util.Set;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import Config.config;

public class AddCollectionPoint_Email {

@Test
@Parameters({"DATAPROVIDER"})
public void Addcollection(String DataProvider)
{

    config.driver.findElement(By.id("collectionPointsMenu")).click();
    config.driver.findElement(By.xpath("//a[@href='addCollectionPoint']")).click();
    config.driver.findElement(By.xpath("//a[@data-ng-click='resetEmailCollectionTab()']")).click();
    config.driver.findElement(By.xpath("//a[@data-ng-click='resetFtpCollectionTab()']")).click();
    **config.driver.findElement(By.xpath("//a[@data-ng-click='resetEmailCollectionTab()']")).click();**
    WebElement element = config.driver.findElement(By.xpath("//div[@class='modal-content']")).findElement(By.xpath("//div[@class='modal-footer']"))
            .findElement(By.xpath("//div[@class='bootstrap-dialog-footer-buttons']")).findElement(By.xpath("//button[@class='btn btn-primary']"));

    JavascriptExecutor executor = (JavascriptExecutor)config.driver;
    executor.executeScript("arguments[0].click();", element);
    config.driver.findElement(By.xpath("//input[@name='selectedDataProvider']")).sendKeys(DataProvider);



}
}

我无法单击“确定”按钮,因为异常元素不可见。 然后我实现了 Webdriver 等待,但它也不起作用,我得到了超时异常。请帮我解决这个问题。我的代码在双星标记线之前工作正常。

【问题讨论】:

    标签: javascript java selenium


    【解决方案1】:

    当弹出窗口发生时,我相信它已在驱动程序中注册为新窗口。您可能需要切换到新窗口才能解析该页面上的元素。

    public class AddCollectionPoint_Email {
    
        @Test
        @Parameters({"DATAPROVIDER"})
        public void Addcollection(String DataProvider)
        {
    
            config.driver.findElement(By.id("collectionPointsMenu")).click();
            config.driver.findElement(By.xpath("//a[@href='addCollectionPoint']")).click();
            config.driver.findElement(By.xpath("//a[@data-ng-click='resetEmailCollectionTab()']")).click();
            config.driver.findElement(By.xpath("//a[@data-ng-click='resetFtpCollectionTab()']")).click();
    
    
            //Capture the current Working Window handle
            String currentWindowHandle = config.driver.getWindowHandle();
    
            //Performing this interaction causes the confirmation dialog to open.
            config.driver.findElement(By.xpath("//a[@data-ng-click='resetEmailCollectionTab()']")).click();**
    
            //At this point I expect there to be 2 window handles.  My original and the new one opened by the previous invocation.
            List<String> allHandles = config.driver.getWindowHandles();
    
            //assert size maybe?
    
            allHandles.remove(currentWindowHandle);
    
            String dialogHandle = allHandles.get(0);
            try {
                //Transfer focus to the dialog!
                config.driver.switchTo().window(dialogHandle);
                //Now we're on the dialog, find the button and click it.
                WebElement element = config.driver.findElement(By.xpath("//div[@class='modal-content']")).findElement(By.xpath("//div[@class='modal-footer']"))
                    .findElement(By.xpath("//div[@class='bootstrap-dialog-footer-buttons']")).findElement(By.xpath("//button[@class='btn btn-primary']"));
            } finally {
                //All actions on the dialog are completed, switch back to the main window to continue process.
                config.driver.switchTo().window(currentWindowHandle);
            }
    
            //I'm assuming this happens in the original window.  Move into the try block if it happens in the dialog.
            JavascriptExecutor executor = (JavascriptExecutor)config.driver;
            executor.executeScript("arguments[0].click();", element);
            config.driver.findElement(By.xpath("//input[@name='selectedDataProvider']")).sendKeys(DataProvider);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我不明白你是否尝试过点击 WebElement 方法element.click(); 您能否指定您的 WebDriver 实现并发布日志。

      我猜是点击打开弹窗,config.driver.findElement(By.xpath("//a[@data-ng-click='resetEmailCollectionTab()']")).click();

      你能检查一下这个布尔值是否为真

      boolean isDisplayed = config.driver.findElement(By.xpath("//div[@class='modal-content']")).findElement(By.xpath("//div[@class='modal-footer']"))
              .findElement(By.xpath("//div[@class='bootstrap-dialog-footer-buttons']")).findElement(By.xpath("//button[@class='btn btn-primary']")).isDisplayed();
      

      【讨论】:

        【解决方案3】:

        试试这个:

            WebDriverWait wait = new WebDriverWait(config.driver, 20);          
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='modal-content']")))); 
            WebElement element = config.driver.findElement(By.xpath("//div[@class='modal-content']")).findElement(By.xpath("//div[@class='modal-footer']")) .findElement(By.xpath("//div[@class='bootstrap-dialog-footer-buttons']")).findElement(By.xpath("//button[@class='btn btn-primary']")); 
            JavascriptExecutor executor = (JavascriptExecutor)config.driver; 
            executor.executeScript("arguments[0].click();", element); 
            config.driver.findElement(By.xpath("//input[@name='selectedDataProvider']")).sendKeys(DataProvider);
        

        【讨论】:

        • 他在描述中提到 WebDriverWait 没有帮助,并导致 TimeoutException
        猜你喜欢
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2020-03-16
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2017-01-17
        • 1970-01-01
        相关资源
        最近更新 更多