2010-05-11 8 views
7

Używam XPath z Selenium całkiem szczęśliwie, a nawet używając getEval z wyjątkiem JavaScript, ale kolega powiedział, że byłoby wspaniale móc korzystać z JQuery selektory w Selenie.Jak dodać lokalizatory JQuery do Selenium Remote Control

Mam googleed to, ale nie mogę znaleźć żadnych artykułów, które wydają się działać dla mnie. Czy ktoś może dostarczyć wyczerpujący przewodnik na temat używania składni JQuery do wyodrębniania elementów doc i ich wartości z selenu.

Używam C# do pisania moich testów selenu, więc jeśli jakiekolwiek przykłady mogłyby być z perspektywy C#, byłoby świetnie.

Dzięki

Odpowiedz

9

Karl Swedberg napisał doskonały wpis w blogu na ten temat, który można znaleźć na http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet

dostosowaliśmy ten iw zasadzie w pliku jar Selenium Server my zmodyfikowanej RemoteRunner.html włączyć JavaScript jQuery (otrzymany od http://code.jquery.com/jquery-latest.min.js):

 <script language="JavaScript" type="text/javascript" src="jquery.min.js"></script> 
     <script language="JavaScript" type="text/javascript"> 
      function openDomViewer() { 
       var autFrame = document.getElementById('selenium_myiframe'); 
       var autFrameDocument = new SeleniumFrame(autFrame).getDocument(); 
       this.rootDocument = autFrameDocument; 
       var domViewer = window.open(getDocumentBase(document) + 'domviewer/domviewer.html'); 
       return false; 
      } 
     </script> 

Następnie włączyć to do stosowania w selen dodamy strategię lokalizacji:

mySelenium.addLocationStrategy("jquery", 
      "var loc = locator; " + 
      "var attr = null; " + 
      "var isattr = false; " + 
      "var inx = locator.lastIndexOf('@'); " + 

      "if (inx != -1){ " + 
      " loc = locator.substring(0, inx); " + 
      " attr = locator.substring(inx + 1); " + 
      " isattr = true; " + 
      "} " + 

      "var found = jQuery(inDocument).find(loc); " + 
      "if (found.length >= 1) { " + 
      " if (isattr) { " + 
      "  return found[0].getAttribute(attr); " + 
      " } else { " + 
      "  return found[0]; " + 
      " } " + 
      "} else { " + 
      " return null; " + 
      "}" 
     ); 

Uwaga powyższe dodanie strategii lokalizatora jest w Javie, ale jest to tylko ciąg znaków, więc powinien być łatwo replikowany w języku C#. JQuery robi rzeczy dużo szybciej, szczególnie w Internet Explorerze!

Aby zmodyfikować słoik, można użyć narzędzia wiersza poleceń java do zaktualizowania pobranego pliku jar selenu. Utwórz folder na tym samym poziomie co jar o nazwie "core" i umieść w nim zmodyfikowane pliki RemoteRunner.html i jquery.min.js. Następnie należy uruchomić coś takiego:

jar -uf selenium-server-standalone-2.0b3-APT.jar core\RemoteRunner.html 
jar -uf selenium-server-standalone-2.0b3-APT.jar core\jquery.min.js 

Jeśli słoik nie jest w ścieżce można użyć pełnej ścieżki, na przykład w systemie Windows można wykonać go z czymś takim:

"C:\Program Files\Java\jdk1.6.0_22\bin\jar.exe" <arguments> 
+0

znalazłem to bardzo interesujące! ale główne pytanie brzmi: jak możemy użyć tego rozszerzenia jquery, np.wpisz w polu tekstowym zaznaczonym przez jquery? –

+2

@Andreas wystarczy użyć jquery =, aby uruchomić wyrażenie lokalizatora, a następnie użyć jquery! Przykładowe wyrażenie lokalizatora (celowo nie najprostszy przykład): "jquery = table # myParentTableID> input.input-class" – Zugwalt

+0

dziękuję, udało się! –

0

trzeba by zdefiniować nową strategię lokalizacji przy użyciu metody AddLocationStrategy i będą musiały zawierać jQuery w pliku użytkownika extensions.js.

0

można odczytywać i execute_script, aby włączyć jQuery:

  • Najpierw możesz przeczytać jquery z pliku jquery.js lub jquery.min.js.
  • Następnie za pomocą execute_script (jquery), aby włączyć jquery dynamicznie.
  • Teraz możesz komunikować się z jquery.

Oto niektóre kodu w Pythonie, inny język byłby podobny:

browser = webdriver.Firefox() # Get local session of firefox 

with open('jquery.min.js', 'r') as jquery_js: #read the jquery from a file 
    jquery = jquery_js.read() 
    browser.execute_script(jquery) #active the jquery lib 

#now you can write some jquery code then execute_script them 
js = """ 
    var str = "div#myPager table a:[href=\\"javascript:__doPostBack('myPager','%s')\\"]" 
    console.log(str) 
    var $next_anchor = $(str); 
    if ($next_anchor.length) { 
     return $next_anchor.get(0).click(); //do click and redirect 
    } else { 
     return false; 
    }""" % str(25) 

success = browser.execute_script(js) 
if success == False: 
    break 

PS: Kiedy używam selen, aby pobrać niektóre treści z jakiejś stronie, zawsze zakazać mnie. Teraz powinieneś użyć jakiegoś proxy, aby przejść przez to.
o to kod:

PROXY_HOST = "127.0.0.1" 
PROXY_PORT = 8087 
SOCKS_PORT = 8088 

fp = webdriver.FirefoxProfile() 

# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5 
fp.set_preference("network.proxy.type", 1) 

fp.set_preference("network.proxy.http", PROXY_HOST) 
fp.set_preference("network.proxy.http_port", PROXY_PORT) 
fp.set_preference("network.proxy.socks", PROXY_HOST) 
fp.set_preference("network.proxy.socks_port", SOCKS_PORT) 
fp.set_preference("network.proxy.ftp", PROXY_HOST) 
fp.set_preference("network.proxy.ftp_port", PROXY_PORT) 
fp.set_preference("network.proxy.ssl", PROXY_HOST) 
fp.set_preference("network.proxy.ssl_port", PROXY_PORT) 

fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired 

browser= webdriver.Firefox(firefox_profile=fp) # with proxy 
browser = webdriver.Firefox() # no proxy 
browser.get("http://search.example.com") # Load page 

elem = browser.find_element_by_id("query_box") # Find the query input 
elem.send_keys(u'my query string') # send query string to the input 
elem.submit() # submit the query form 
Powiązane problemy