Archiwa tagu: ruby

How to check if element is invisible in Ruby Selenium client

How to check if element is invisible in Ruby Selenium client? In Java or C# answer is easy. There is a mechanism called ExpectedCondition, which has got ready for use method: ExpectedConditions.invisibilityOfElementLocated. Example:

driverWait.until(ExpectedConditions.invisibilityOfElementLocated(element));

Unfortunatelly, Ruby client hasn’t got anything like this. Quick workaround – try to find element. When element is not displayed, catch exception and return false:

def check_if_not_exist(locator)
  begin
    wait = Selenium::WebDriver::Wait.new :timeout => 10
    wait.until { @driver.find_element(:name, 'elementName').displayed? }
  rescue
    false
  end
end

Not very elegant and quick, but works.

 

Jak szybko nauczyć się programować w Ruby?

Ruby to świetny język, zarówno jako pomocniczy język (skryptowy), jak i do nauki programowania od podstaw – choć tu jednak jestem tradycjonalistką i na początek polecam raczej języki o składni podobnej do C, czyli C/C++, C#, Java, ewentualnie… JavaScript, choć to mocno kontrowersyjne;)

Wracając jednak do Ruby – znalazłam w sieci kilka interaktywnych tutoriali. Chyba najładniejszy to: http://tryruby.org/levels/1/challenges/0. Wygląda jak książka o Kubusiu Puchatku 🙂 Jest dość krótki, przechodzi się go raz dwa.

Try Ruby

Mniej uroczym, ale również interaktywnym tutorialem jest https://www.codecademy.com/learn/ruby.

Code Academy

Code Academy poza kursem Ruby oferuje także mnóstwo innych kursów dotyczących technologii webowych, np. SQL, HTML, Rails itd. Nic tylko się uczyć:)

 

Warty sprawdzenia jest także https://rubymonk.com/.

Ruby Monk

 

 

OptParse

Do obsługi parametrów wejściowych do skryptu w Ruby jest biblioteka OptParse . Aby jej użyć, wystarczy dołączyć ja poprzez: require 'optparse'. Nie jest ona jednak idealna – brak jej sensownej obsługi parametrów wymaganych/opcjonalnych, dodatkowo czasem kod nadmiernie rozrasta się. Plusem jest obecna dokumentacja wraz z przykładami i brak konieczności instalacji.

Logika wyrażeń w instrukcjach warunkowych

Logika matematyczna to jedna z bardziej przydatnych w programowaniu (i ogólnie informatyce) dziedzin matematyki. Dzięki prawom logiki działają wszystkie układy elektroniczne. W codzienności programisty może przydać się zwłaszcza podczas optymalizacji warunków logicznych.

Przykładowo, inspekcja kodu Ruby w środowisko IntelliJ za błąd uważa sterowanie przepływem za pomocą negatywnego warunku typu: if !condition ... . Taki pojedynczy warunek wystarczy w takim przypadku zamienić na: unless condition .... W przypadku bardziej rozbudowanych warunków przydają się znane z liceum prawa de Morgana.

I prawo de Morgana (zaprzeczenia koniunkcji)
~(p ^ q) <==> (~p v ~q)

Poniższy kod sprawdza, czy jest widoczny nagłówek. Nagłówek powinien mieć tytuł oraz podtytuł. Jeżeli obydwa tytuły są widoczne, uznajemy ze jest wyświetlony poprawnie. I tak następujące instrukcje warunkowe:

if !is_title_displayed || !is_subtitle_displayed
  puts 'Header not visible!'
end

można zamienić na:

unless (is_title_displayed && is_subtitle_displayed)
  puts 'Header not visible!'
end

Zobaczmy, jak to działa.

def check(p, q)
  if !p || !q
    puts 'Header not visible!'
  else
    puts 'Header is displayed.'
  end
end

def check_morgan(p, q)
  unless p && q
    puts 'Header not visible!'
  else
    puts 'Header is displayed.'
  end
end

Czytaj dalej

[Ruby] concat czy concat!?

Funkcji concat chyba nikomu nie trzeba przedstawiać – służy co łączenia stringów. W Ruby działa identycznie jak jej odpowiednik w Javie – do stringa, na którym została wywołana, dokleja wartość argumentu.

a1 = "Ola"
Wynikiem przypisania jest: „Ola”

a1.concat("Makota")
Zmienna a1 zawiera teraz cały ciąg: „OlaMakota”.

Nasuwa się więc pytanie, czy zgodnie z konwencją przyjętą w Ruby, funkcja ta nie powinna nazywać się "concat!"? Konwencja ta mówi, że funkcje dokonujące „drastycznych” modyfikacji obiektu powinny zawierać wykrzyknik.

Przykładowo:
a1="DoloresRyba"
a1.upcase

Funkcja zwraca: „DOLORESRYBA”, natomiast wartość obiektu a1 to nadal „DoloresRyba”.

a1.upcase!
Funkcja zwraca: „DOLORESRYBA”, wartość obiektu a1 została również zmodyfikowana – wartością a1 jest również „DOLORESRYBA”.

Testy Windows Phone

Automatyczne testowanie Windows Phone wydaje się być na ten moment dość problematyczne. Appium, które pomimo rożnych niedociągnięć, jest jednak całkiem niezłym narzędziem do automatyzacji testów aplikacji mobilnych, nie oferuje aktualnie wsparcia dla Windows Phone (obecnie dostępna jest obsługa Android i iOS).

Garść linków na temat narzędzi do testów Windows Phone:
https://github.com/2gis/Winium.StoreApps – dość żywy projekt, ostatnia aktualizacja wczoraj. Projekty z rodziny Winium umożliwiają testowanie aplikacji na emulatorze i prawdziwym urządzeniu. Wymagany jest jednak Visual Studio, Windows 8.
https://winphonewebdriver.codeplex.com/ – raczej nie aktualizowane, ostatni update: 23.11.2013
https://github.com/appium/windows-phone-8-bootstrap – ostatnia aktualizacja: maj 2015
https://discuss.appium.io/t/how-to-automate-windows-phone-8-1/2716/2 – dyskusja na forum Appium
https://msdn.microsoft.com/en-us/library/dn747198.aspx – oficjalny artykuł Mictosoftu: Testing Windows Phone Apps with Coded UI Tests (na symulatorze). Coded UI zdaje się działać tylko na „WinRT-XAML based phone apps (which were added in Windows Phone 8.1)„.

Wartości logiczne w Ruby, JavaScript i ActionScript

Naukę języka programowania zaczynamy przeważnie od poznania podstawowych konstrukcji:  sposobu deklarowania zmiennych, pętli, instrukcji warunkowych. Wtedy często pojawia się pytanie, które wartości są w wyrażeniach logicznych traktowane jako true, a które jako false? O ile w językach typu Java/C# sprawa jest dość prosta, bo większość wartości nie konwertuje się do typów boolean, to w przypadku języków skryptowych każdy z nich rządzi się innymi prawami.

Poniżej przedstawiam porównanie kilku z nich: JavaScript, ActionScript, Ruby. Linearne przełożenie niektórych wartości nie jest w 100% możliwe, np. zmienne niezdefiniowane – w JavaScript istnieje słowo kluczowe  „undefinied”, natomiast w Ruby nie ma możliwości ustanowienia zmiennych niezdefiniowanych.

Argument JavaScript Ruby ActionScript
0 false true false
-1 true true true
5 true true true
„” false true false
„string” true true true
” „ true true true
null false false false
undefinied exception exception false
var x (uninitialized) false exception false
new Object (initialized) true true true
NaN false true false

Czytaj dalej

Ruby: hash as argument

What will Ruby do, when we pass hash as argument to function? Let’s see.

We have method – with definied default value (empty hash):

def foo(hashh = {})
  puts 'Is hash empty? ' + hashh.empty?.to_s,""
end

1. When we invoke function with any hash, it will be passed into method. Output? „Is hash empty? false„.

foo({:id => 'someid'})

h = {:id => 'first', :name => 'noname'}
foo(h)

2. When we invoke function without any parameter, Ruby will take default value – empty hash. Output is „Is hash empty? true„.

foo

3. Of course, when we pass nil to function, we will got exception: „undefinied method ’empty’ for nil:NilClass„.

foo(nil)