是否有可能使用硒在DOM树中找到具有特定模式的元素?

时间:2014-02-21 18:25:13

标签: python selenium

我在python中使用Selenium来查找DOM树中的一些元素。我想找到具有特定模式的类名。我该怎么做才能找到这样的课程名称?我想用find_elements_by_class_name使用正则表达式,但我不知道如何做到这一点。请建议我该怎么做。

例如:我想find_elements_by_class_name(browser, 'webstore-de-Kb'),但deKb部分总是在变化,我想搜索webstore-[a-zA-Z]+[a-zA-Z]+-[a-zA-Z]+[a-zA-Z]+

之类的内容

有可能做那样的事吗?如果有,怎么样?如果不是,还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

我建议学习CSS。你可以做各种各样的事情。在您的示例中,您可以执行以下操作:

a[id^='the_id']
当元素 <a href="#" id="the_id_12345" />

时,

我详细介绍了您可以在此处使用的不同类型的选择器: http://ddavison.github.io/css/2014/02/18/effective-css-selectors.html

您可以使用:

  • 属性等于(=)
  • 属性以(^ =)
  • 开头
  • 属性包含(* =)
  • 属性以($ =)
  • 结尾

答案 1 :(得分:0)

您可以直接执行javascript并让selenium为您返回结果。这意味着您基本上可以使用任何条件查找元素,而不仅仅是id或类名甚至xpath。

使用execute_script方法:

# Note: I don't know python so forgive any syntax errors.
# This example is modified from the one in the Selenium documentation:
element = driver.execute_script(
    "function domTraverse (el,callback) {" +
    "  if (callback(el)) return el;" +
    "  else {" +
    "    var ret;" +
    "    for (var x=0;x<el.children.length;x++) {" +
    "      ret = domTraverse(el.children[x],callback);" +
    "      if (ret) return ret;" +
    "    }" +
    "  }" +
    "  return null" +
    "}" +
    "return domTraverse(document.body,function(e){" +
    "  // match desired regex:" +
    "  return e.className.match(/webstore-[a-zA-Z]+[a-zA-Z]+-[a-zA-Z]+[a-zA-Z]+/);" +
    "});"
    )

显然,如果您在页面上加载了jQuery或YUI之类的东西,可以使用它们而不是编写自己的自定义DOM解析函数。