Selenium脚本在Firefox浏览器上失败

时间:2017-01-19 07:43:06

标签: java selenium selenium-webdriver geckodriver

我正在使用 -

  

Selenium 3.0.1 with java

     

Firefox版本:50.1.0

     

geckodriver-v0.13.0-Win64的

我已经为我的网络应用程序创建了一个完整的测试服务。当我在chrome浏览器上运行它时,所有测试都顺利进行。完全没问题但是对于浏览器兼容性测试,我切换到firefox驱动程序并运行测试,我的测试总是失败。输入字段出现问题,我猜输入文本的速度太快了,即使文本没有填入文本框,但它点击了提交按钮,因为我能够看到空白字段验证消息。我很想知道如何解决这个问题。我是否需要在FF上调试和运行我的整个脚本,还是有任何可行的解决方案?

Eidted

我有一个DriverSetup类,其中放置了以下代码 -

public class DriverSetup 
{
    public static WebDriver driver;
    @BeforeTest
    @Parameters("browser")
    public void setUp( @Optional String browser) throws IOException
    {
        try
        {
            switch(browser)
            {
                    case "chrome":

                        System.out.println("Starting chrome........");
                        System.setProperty("webdriver.chrome.driver","D:/Application/ChromeDriver/chromedriver.exe");
                        driver = new ChromeDriver();        
                        driver.manage().window().maximize();
                        driver.get(TestData.mainSiteURL);
                        driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS);
                        ScreenCapture.passedScreenShot();
                    break;

                    case "firefox":
                        System.out.println("Starting Firefox........");
                        System.setProperty("webdriver.gecko.driver","D:/Application/geckodriver.exe");
                        driver = new FirefoxDriver();       
                        driver.manage().window().maximize();
                        driver.get(TestData.mainSiteURL);                   
                        driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS);
                        ScreenCapture.passedScreenShot();
                    break;
                }
        }
        catch(Exception e)
        {
            System.out.println("Exception In : "+Thread.currentThread().getStackTrace()[1].getClassName()+"-->"+Thread.currentThread().getStackTrace()[1].getMethodName());
            ScreenCapture.failedScreenShot();
        }
    }
}

另一个是SubmitNewContact

public class SubmitNewContact extends DriverSetup
{

    @Test
    public void submitNewContact() throws IOException
    {

        try
        {
            driver.findElement(By.linkText("Contact")).click();
            driver.findElement(By.id("Name")).sendKeys(TestData.contactName);
            driver.findElement(By.id("Phone")).sendKeys(TestData.contactPhone);
            driver.findElement(By.id("EmailID")).sendKeys(TestData.contactEmail);
            driver.findElement(By.id("message")).sendKeys(TestData.contactMessage);
            ScreenCapture.passedScreenShot();
            driver.findElement(By.xpath("//button[@type='submit']")).click();   
            ScreenCapture.passedScreenShot();
            Thread.sleep(3000);
        }

        catch(Exception e)
        {

            System.out.println("Exception In : "+Thread.currentThread().getStackTrace()[1].getClassName()+"-->"+Thread.currentThread().getStackTrace()[1].getMethodName());
            ScreenCapture.failedScreenShot();
        }

    }
}

使用testNG运行这两个类 -

  <test name="ExecuteTestFirefox">
    <parameter name="browser" value="firefox" />
         <classes>                  
                    <class name="com.testmaster.DriverSetup"/>
                    <class name="com.test.user.SubmitNewContact"/>
         </classes> 
  </test>

注意: - 还为我的应用程序的每个功能提供了一些其他类SubmitNewContact,然后运行testing.xml

3 个答案:

答案 0 :(得分:1)

相同的代码适用于chrome?根据我的经验,geckodriver仍然存在这种难以使用的问题。如果您无法为此创建解决方法,并且切换到chromedriver(或其他驱动程序)不是一种选择,我建议您使用“旧”&#39; Firefoxdriver而不是geckodriver / marionette。

但是当然,在这里发布你有问题的代码,这样我们就可以先解决问题了。 :)

答案 1 :(得分:0)

当你遇到麻烦时,一个好的帮助/解决方案总是需要额外的等待时间。为了做到这一点,我建议你使用这样的函数,等待找到一个元素:

public static void implicitlyWaitForElementPresent(FirefoxDriver driver, By elementToBePresent) {
    // Waits up to 45 seconds while searching for the given Element to be present
    driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS);
    try {
        driver.findElement(elementToBePresent);
    } catch (org.openqa.selenium.NoSuchElementException e) {
        e.printStackTrace();
    }
}

您可以通过以下方式使用此方法:

public void clickSomething() {
    Utility.implicitlyWaitForElementPresent(mDriver, By.xpath("//*[@id='wrapper']/div[2]/div/ul[3]/li/a"));
    WebElement something = mDriver.findElement(By.xpath("//*[@id='wrapper']/div[2]/div/ul[3]/li/a"));
    something.click();
}

请注意,出于OOP原因,我已将wait-function放在另一个类中。 您可以根据需要更改此代码。

如果您还有其他问题,我可以随时为您提供帮助。

答案 2 :(得分:0)

我遇到了完全相同的问题。在某些表单上,sendKeys()方法正在发送密钥,我可以在屏幕截图中看到它们,但是我收到的消息是我必须填写表单。在其他页面上它运作良好。同样在chrome中我使用完全相同的代码,我没有问题。

有没有人有selenium 3.0.1的解决方案?

信息:我正在使用firefox docker设置。

public void sendKeys(By objectPath, CharSequence key){
    RemoteWebDriver browserDriver = DriverFactory.getInstance().getDriver();
    WebDriverWait wait = new WebDriverWait(browserDriver, BuildDriverHandler.timeout);
    wait.until(ExpectedConditions.visibilityOfElementLocated(objectPath));
    wait.until(ExpectedConditions.elementToBeClickable(objectPath)).sendKeys(key);
}

sendkeys send something, but still I have to fill the form