Selenium无法找到除ID以外的HTML元素

时间:2013-10-21 13:30:05

标签: python jsp selenium selenium-webdriver

我正在尝试使用selenium编写python程序,不幸的是我遇到了一个奇怪的问题。我有用JSP编写的网页,除.find_element_by_*外,我无法使用.find_elements_by_id命令访问元素。没有标签可以找到。

如果我使用其ID访问某些元素,那么我可以通过其他查找命令(例如tag_namename等)访问其子元素。例如,如果我有这个HTML:

<div id="myId">
    <div name="myName">Test Div</div>
</div>

我可以使用div访问内部.find_element_by_id("myId").find_element_by_name("myName"),但我无法使用.find_element_by_name("myName")访问它,如果我对整个HTML使用.find_elements_by_tag_name("div"),我会得到一个空列表

实际上我的网页与IE 7兼容,我试图在desired_capabilities中设置参数版本,但它没有帮助,网页驱动程序默认加载IE 10。

编辑1:

这是我使用的python脚本:

from selenium import webdriver

def my_method(web_driver = "Firefox"):
    # launch web-driver
    if web_driver.upper() == "IE":
        driver = webdriver.Ie()
        print "IE"

    else:
        driver = webdriver.Firefox()
        print "FireFox"

    # navigating
    driver.get("http://python.org")

    # accessing elements
    ## .find_by_tag_name
    e = driver.find_elements_by_tag_name("html")
    print "number of html tags: " + str(len(e))

    e = e[0].find_elements_by_tag_name("a")
    print "number of A tags using html tag: " + str(len(e))

    e = driver.find_elements_by_tag_name("a")
    print "number of A tags: " + str(len(e))

    e = driver.find_elements_by_tag_name("body")
    print "number of body tags: " + str(len(e))

    e = driver.find_elements_by_tag_name("html")
    e = e[0].find_elements_by_tag_name("body")
    print "number of body tags using html tag: " + str(len(e))

    ## .find_by_xpath
    e = driver.find_elements_by_xpath("//a")
    print "number of A xpath: " + str(len(e))

    e = driver.find_elements_by_xpath("/html/body")
    print "number of body xpath: " + str(len(e))

    ## .find_by_class_name
    e = driver.find_elements_by_class_name("reference")
    print "number of A using class name: " + str(len(e))

    ## .find_by_css_selector
    e = driver.find_elements_by_css_selector("a[class='reference']")
    print "number of A using css selector: " + str(len(e))

    driver.close()

# execute
my_method(web_driver = "Firefox")
my_method(web_driver = "Ie") 

编辑2:

在HTML中我们必须分开部分:菜单和主页面。每个都有一个HTML标记,并单独呈现。两部分中的结果HTML代码都很简单,与此类似:

<html lang="en_us">
    <body>
        <div id="testdiv">
        <table align="center" border="0">
            <tr bgcolor="#666666">
                <td><img src="img.jpg"/></td>
                <td><div id="message" style="color:white;font-size:12px;font-    weight:bold;">message</div></td>
            </tr>
        </table>
        </div>
    </body>
</html>

编辑3:

如果有人熟悉JSP,我想知道如何将JSP标记转换为HTML标记,因为它可以帮助我检测有关访问标记的问题。

2 个答案:

答案 0 :(得分:0)

这种情况发生了。我也遇到过同样的问题。

我使用XPath解决了它。对于您的问题,XPath表达式将是:

//div/div[contains(@name,"myName")]

OR

//div[contains(@name,"myName")]

OR

//div[text()="Test Div"]

OR

//div[@id="myId"]/div

答案 1 :(得分:0)

感谢大家在这个问题上试图帮助我。我解决了这个问题,我认为分享解决方案会很棒。

实际上有些东西我没有注意;页面中有多个帧,我不得不在帧之间切换以访问元素。因此,为了首先切换到每个帧,我使用.switch_to_default_content()切换到主要内容,然后.switch_to_frame(frame_object)切换到所需的帧。