Pesquisar este blog

segunda-feira, 29 de maio de 2017

Enviando comandos para qualquer aplicativo através do Ruby.


Muitas das vezes estamos trabalhando com automação de testes e precisamos enviar um determinado comando para um aplicativo e não funciona corretamente, temos uma segunda opção pelo Wscript.Shell que é um objeto que permite acesso direto ao shell do Windows, através do método SendKeys podemos enviar comandos do Windows.


# Require the win32ole library:
require 'win32ole'

'
To maximixe the active window "% x" (Alt+SpaceBar, x)
To minimize the active window "% n" (Alt+SpaceBar, n)
To restore the active window "% r" (Alt+SpaceBar, r)
To close window "%{F4}"
# ALT+A --> wsh.SendKeys("%a")

# ENTER --> wsh.SendKeys("{ENTER}")
Temos uma lista de comandos no site da microsoft abaixo:
 https://msdn.microsoft.com/en-us/library/8c6yea83.aspx
'

# Cria a instancia do Wscript Shell, para poder usar os metodos.
wsh = WIN32OLE.new('Wscript.Shell')

# Passar o Nome da Janela atual
if wsh.AppActivate('*new 3 - Notepad++')
  # Tempo de espera em segundos
  sleep(1)
  # comando SendKeys para enviar o comando
  wsh.SendKeys("% x")
end



----------------------------------------------------------
KeySpecial Character
  SHIFT+
  CTRL^
  ALT%
----------------------------------------------------------

terça-feira, 25 de abril de 2017

Como corrigir no Ruby certificate verify failed



Erro no SSL certificado, o erro é devido você ter um certificado antigo, que não é mais válido.

1. Abra o cmd e digite os comandos abaixo:
gem which rubygems

# Dê um start dentro da pasta rubygems, mude para o caminho correto da sua versão:
start C:\Ruby23\lib\ruby\2.3.0\rubygems

1.2. Agora devemos copiar o certificado para a pasta ssl_certs, o meu caminho abaixo é esse dependendo da versão o caminho muda, ou seja atualize o caminho do ssl_certs abaixo:

Link do Certificado:

# deve baixa o certificado no link acime e colocar nessa pasta:
C:\Ruby23\lib\ruby\2.3.0\rubygems\ssl_certs

Feche o cmd e abra novamente e agora deve funcionar.


2) Se você está precisando somente Instalar a gem, sem resolver o problema, basta instalar a gem apontando somente o http sem mudar o anterior.

gem install rails --source http://rubygems.org


3)  A terceira forma é Mudar o endereço https pelo http, ou você pode adicionar as duas.

gem source -a http://rubygems.org/
gem source --update
gem source -r https://rubygems.org/

# os comandos são
# adicionar -a/--add
# remover -r/--remove
# lista os sites -l/--list

gem sources --add http://rubygems.org
gem sources --remove https://rubygems.org
gem sources --list
gem source --update


** Observação fechar o cmd do windows e abra novamente para instalar.

No MAC e no Linux:
Baixe o certificado no site: http://curl.haxx.se/ca/cacert.pem
E depois copie e replace o certificado atual no caminho:
/usr/local/etc/openssl/cert.pem.
E por fim adicione ao path:
export SSL_CERT_FILE=/usr/local/etc/openssl/cert.pem

Você pode instalar pelo Homebrew (precisa instalar ele primeiro):
brew update
brew install openssl
brew link openssl --force
brew install curl-ca-bundle


Referências:
https://gist.github.com/fnichol/867550 
https://railsapps.github.io/openssl-certificate-verify-failed.html
https://stackoverflow.com/questions/20399531/how-to-tell-gem-command-not-to-use-ssl

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