我正在尝试使用selenium编写python程序,不幸的是我遇到了一个奇怪的问题。我有用JSP编写的网页,除.find_element_by_*
外,我无法使用.find_elements_by_id
命令访问元素。没有标签可以找到。
如果我使用其ID访问某些元素,那么我可以通过其他查找命令(例如tag_name
,name
等)访问其子元素。例如,如果我有这个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标记,因为它可以帮助我检测有关访问标记的问题。
答案 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)
切换到所需的帧。