我正在使用 -
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
答案 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);
}