2

我在用着 -

Selenium 3.0.1 与 java

火狐版本:50.1.0

geckodriver-v0.13.0-win64

我已经为我的 Web 应用程序创建了一套完整的测试套件。当我在chrome浏览器上运行它时,所有测试都运行顺利。完全没有问题,除了浏览器兼容性测试,我切换到firefox驱动程序并运行测试,我的测试总是失败。输入字段出现问题,我猜输入文本的速度太快了,即使文本没有填写在文本框中,但它正在单击提交按钮,因为我可以看到空白字段验证消息。我米吸了如何处理这个。我需要在 FF 上调试和运行我的整个脚本还是有任何可行的解决方案?

编辑

我有一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

4

3 回答 3

1

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

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

于 2017-01-19T07:49:38.163 回答
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 的原因,我已将等待功能放在不同的类中。您可以根据需要更改此代码。

如果您还有其他问题,我会在这里为您提供帮助。

于 2017-01-19T10:40:26.037 回答
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 发送一些东西,但我仍然必须填写表格

于 2017-02-10T12:45:33.007 回答