2010-10-05 3 views
4

Я искал и пытался найти способ щелкнуть ссылку в селене, которая соответствует регулярному выражению.Нажав ссылки regexp в python selenium

Вот код, который работает;

from selenium import selenium 
sel = selenium("localhost", 4444, "*chrome", "http://www.ncbi.nlm.nih.gov/") 
sel.start() 
sel.open('/pubmed') 
sel.type("search_term", "20032207[uid]") 
sel.click("search") 
sel.click("linkout-icon-unknown-vir_full") 

Однако если поиск по различным идентификаторам ссылка-текст будет отличаться, но всегда совпадает с регулярным выражением linkout-icon[\w-_]*.

Но я не могу найти правильную команду для нажатия на ссылку, которая соответствует регулярному выражению ... Я пробовал:

sel.click('link=regex:linkout-icon[\w-_]*') 
sel.click('regex:linkout-icon[\w-_]*') 
sel.click('link=regexp:linkout-icon[\w-_]*') 
sel.click('regexp:linkout-icon[\w-_]*') 

Но никто из них не похож на работу на всех. Какие-либо предложения?

EDIT:

Таким образом, после комментариев в ответ ниже: щелкнули деталь на самом деле изображение с идентификатором = linkout-иконкой-неизвестному-viro_full. Полная строка приведена ниже:

<a href="http://vir.sgmjournals.org/cgi/pmidlookup?view=long&amp;pmid=20032207" ref="PrId=3051&amp;itool=Abstract-def&amp;uid=20032207&amp;nlmid=0077340&amp;db=pubmed&amp;log$=linkouticon" target="_blank"><img alt="Click here to read" id="linkout-icon-unknown-vir_full" border="0" src="http://www.ncbi.nlm.nih.gov/corehtml/query/egifs/http:--highwire.stanford.edu-icons-externalservices-pubmed-standard-vir_full.gif" /></a> </div> 

Если вам интересно, я получил код от регистратора Selenium IDE.

ответ

2

sel.click может принимать XPath в качестве аргумента. Использование Firebug я нашел (что я считаю) в XPath к «linkout-икона неизвестного-vir_full» ссылка:

sel.click("//*[@id='linkout-icon-unknown-vir_full']") 

Используя вышеприведенную команду берет меня this page.


я не смог matches работать - я не знаю, почему - но это похоже на работу с использованием contains:

sel = selenium.selenium("localhost", 4444, "*firefox", "http://www.ncbi.nlm.nih.gov/") 
sel.start() 
sel.open('/pubmed') 
sel.type("search_term", "20032207[uid]") 
sel.click("search") 
sel.wait_for_page_to_load(30000) 
sel.click("//*[contains(@id,'linkout')]") 
+0

Правильная идея, но мне нужно регулярное выражение, так как я собираюсь взять их из списков поиска. Для разных поисков мне нужно сопоставить разные ссылки. – JudoWill

0

Я думаю, что вы очень близки. Во-первых, regexp: - это правильный шаблон текста, в котором говорится, что вы хотите использовать регулярное выражение.

Другое дело, что, вероятно, не совсем верно говорит link=, как это относится к тексту звена, а именно:

<a href="path/to/mylink">Text of the link, this is what will be searched</a> 

Так что часть якоря вы хотите использовать ваше регулярное выражение, href?

Что-то, что могло бы привести к правильному ответу заключается в следующем: selenium: Is it possible to use the regexp in selenium locators

Возможно, получить функцию можно было бы перепрофилировать искать все a.href свойства для регулярных выражений, а затем вернуть XPath каждого из них, чтобы затем быть подан в click()

0

После этого некоторые взлома вокруг меня придумать, наверное, самый ослиного способ сделать это, но это работает, пока кто-то не может предоставить мне лучший ответ:

import re 
val = re.findall('linkout-icon-unknown[\w-]*', sel.get_html_source())[0] 
sel.click(val) 

это требует от меня искать весь HTML и, вероятно, придумать ISSU если дизайн меняется.

Мне бы хотелось увидеть более надежный метод.