Pesquisar este blog

sábado, 11 de fevereiro de 2017

Resolvendo problemas de versões antigas e novas do Selenium com Gradle + Java



        Faz tempo que não escrevo um Post pra Galera de testes, vou falar sobre um problema que tive recentemente com um Projeto em Java, dessa inúmeras atualizações do Selenium versões antigas de Browsers deixaram de funcionar.

     Agora você é obrigado a fazer o marionete no Firefox, como me deram a missão de rodar o Selenium em algumas versões do Linux como o Debian, Canaima, essas versões de OS demoram atualizar os Browsers por segurança, tentei atualizar o sistema operacional, mas não funcionou como esperado.

     Procurei outras soluções e pensei como o Gradle é um gerenciado de dependências ou melhor build automation system, deve ter uma maneira de fazer através dele, como não tinha muito tempo pra resolver esse problema consultei um amigo o Gabriel que já trabalhou bastante com java, me sugeriu a seguinte solução.


/*
build.gradle file for building and running Selenium tests
Example uses:
gradle clean test - Rebuild and run tests
gradle test - Run tests only
gradle cleanTest test   - Force tests to be run even if up to date
gradle viewResults - Displays the report of test results (Windows only)
*/

// Support for building and testing
apply plugin: 'java'

// (Optional) configure name and version for jar
jar {
version  '1.0'
baseName 'SeleniumStarter'
extension '.jar'
}

// Cf. Maven properties
ext.junitVersion = '4.11'
ext.seleniumVersion = '2.41.0'


// Cf. Maven <dependencies>
dependencies {
compile group: 'junit', name: 'junit', version: junitVersion
compile group: 'org.seleniumhq.selenium', name: 'selenium-firefox-driver', version:seleniumVersion
    compile group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version:seleniumVersion
compile group: 'org.seleniumhq.selenium', name: 'selenium-api', version:seleniumVersion
compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version:seleniumVersion
}

// A custom task to show report on tests that have run
task viewResults(dependsOn: ['test'] , type:Exec) {
workingDir './build/reports/tests'
commandLine 'cmd', '/c', 'start index.html'
}

// Resolve Maven dependencies as Maven does
repositories {
mavenCentral()
mavenLocal()
}

Temos o exemplo do build.gradle acima ele vai baixar as dependências com um versão especifica, ou seja toda vez que for rodar os testes precisa mudar a versão da dependência, nem todo mundo no projeto vai lembrar disso, uns trabalhando no windows outros no linux e são vários commits pra o branch principal. Resumindo isso vai gerar confusão.

Pra ficar melhor vamos separar as dependências antigas e novas, pra isso vamos criar dois arquivos abaixo, colocando as dependencias do Selenium 2 no antigo e as novas do 3 em dependencias.gradle:
dependencies.gradle
dependencies-old.gradle

No arquivo build.gradle, colocamos o código abaixo:

if (project.hasProperty('old')) {
  println "old"
  apply from: '${rootDir}/dependencies-old.gradle'
} else {
  println "new"
  apply from: '${rootDir}/dependencies.gradle'
}

Para rodar agora no Debian e Canaima vamos usar a opção -Pold
Comando no linux:
sudo ./gradlew -Pold -Dcucumber="--tags @feature_login" test


Não esquecendo que quando instanciar o browser você precisa tratar o antigo e novo, devido que no antigo não precisamos do marionete ficaria somente WebDriver driver = new FirefoxDriver().

No Chromium você precisa passar o comando "--no-sandbox" pra rodar como sudo, se não rodar como sudo vai dar erro nos drivers:

ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
driver = new ChromeDriver(options); 

Ainda dar para fazer melhor pegar a versão do SO e aplicar sozinho, mas vamos deixar isso para o outro POST. Espero que tenham gostado da solução simples, talvez tenha outras soluções, mas essa funcionou bem e foi bem rápido implementar.


Fontes:
[1] http://codesolid.com/using-gradle-to-build-java-selenium-projects/
[2] http://www.seleniumhq.org/docs/03_webdriver.jsp
[3] http://stackoverflow.com/questions/29540320/unable-to-execute-nightwatch-tests-on-chrome-using-linux

12 comentários: