Как добавить локаторы JQuery в Selenium Remote Control
Я с удовольствием использую XPath с Selenium и даже использую getEval с помощью Javascript, но коллега сказал, что было бы здорово использовать селекторы JQuery в Selenium.
я погуглил его, но не могу найти никаких статей, которые, похоже, работают для меня. Может ли кто-нибудь предоставить полное руководство по использованию синтаксиса JQuery для извлечения элементов doc и их соответствующих значений из selenium.
Я использую C# для написания тестов на селен, поэтому, если есть примеры могут быть с точки зрения C# это было бы здорово.
спасибо
3 ответов
Карл Сведберг написал отличную запись в блоге об этом, которую можно найти по адресу http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet
мы адаптировали это и в основном в файле Selenium Server jar мы изменили RemoteRunner.html для включения jQuery JavaScript (получен из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>
затем, чтобы включить это для использования в Selenium, мы добавляем местоположение стратегия:
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; " +
"}"
);
обратите внимание, что вышеуказанное добавление стратегии локатора находится в Java, но его просто строка, поэтому должна быть легко реплицирована в C#. JQuery делает вещи намного быстрее, особенно в Internet Explorer!
чтобы изменить jar, вы можете использовать инструмент командной строки java для обновления загруженного Selenium server jar. Сделайте папку на том же уровне, что и jar под названием "core" и поместите измененный RemoteRunner.html и jquery.минута.файлы js там. Затем запустите что-то например:
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
если jar нет на вашем пути, вы можете использовать полный путь, например, в windows вы можете выполнить его с помощью чего-то вроде:
"C:\Program Files\Java\jdk1.6.0_22\bin\jar.exe" <arguments>
вам нужно будет определить новую стратегию местоположения с помощью AddLocationStrategy метод и нужно будет включить jQuery в ваши пользовательские расширения.файл js.
вы можете читать и execute_script, чтобы включить jQuery:
- сначала вы можете прочитать jquery из jquery.js или jquery.минута.файл js.
- затем с помощью execute_script (jquery) включить jQuery динамически.
- теперь вы можете взаимодействовать с jQuery.
вот какой-то код на python, другой язык будет похож:
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: когда я использую селен, чтобы получить некоторый контент с какого-то сайта, они всегда запрещают мне. Сейчас вы должны использовать какой-то прокси, чтобы пройти его.
вот код:
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