【问题标题】:Clicking links by regexp in python selenium在python selenium中通过正则表达式单击链接
【发布时间】:2011-04-21 09:49:26
【问题描述】:

我一直在环顾四周,试图找到一种方法来单击 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")

但是,如果我搜索不同的 ID,链接文本会有所不同,但它始终与正则表达式 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-_]*')

但它们似乎都不起作用。有什么建议吗?

编辑:

所以在 cmets 在下面的答案之后:点击的项目实际上是一个 id=linkout-icon-unknown-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 记录器中获得了代码。

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    我认为你很接近。首先,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

    也许 get 函数可以重新用于搜索所有 a.href 属性以查找您的正则表达式,然后返回每个属性的 XPath,然后将其提供给 click()

    【讨论】:

      【解决方案2】:

      sel.click 可以将 XPath 作为参数。使用Firebug 我发现(我相信是)“linkout-icon-unknown-vir_full”链接的 XPath:

      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')]")
      

      【讨论】:

      • 正确的想法,但我需要一个正则表达式,因为我将从搜索列表中获取这些。对于不同的搜索,我需要匹配不同的链接。
      【解决方案3】:

      在做了一些黑客攻击之后,我想出了可能是最愚蠢的方法,但它可以工作,直到有人可以为我提供更好的答案:

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

      这需要我搜索整个 html,如果设计发生变化,可能会出现问题。

      我希望看到更强大的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多