我一直在使用Python的Selenium Webdriver获取带有此HTML代码的元素。 但是,我无法访问此#document标记内的任何元素。
我用过两者
driver.find_element_by_xpath("html/body/div[@id='frame']/iframe/*")
,我试过了
elem = driver.find_element_by_tag("iframe")
,紧随其后
elem.find_element_by_xpath
找到内部元素但失败了。
我也尝试用driver.switch_to_frame(driver.find_element_by_tag("iframe"))
跟随xpath表达式查找内部元素,但它也没有用。
框:
<div>
<iframe>
#document
<html>
<body>
<div>
....
</div>
</body>
</html>
</iframe>
</div>
答案 0 :(得分:6)
切换到iframe然后使用普通查询方法是正确的使用方法。我在整个大型测试套件中成功使用它。
请记住,在iframe中完成工作后,请切换回默认内容。
现在,解决您的问题。你是如何提供iframe的内容的?您是否真的只是编写了html并将其保存到文件中,或者您正在查看示例站点。您可能会发现iframe实际上并不包含您期望的内容。试试这个。
from selenium.webdriver import Firefox
b = Firefox()
b.get('localhost:8000') # or wherever you are serving this html from
iframe = b.find_element_by_css_selector('iframe')
b.switch_to_frame(iframe)
print b.page_source
这将是iframe中的html。内容是您所期望的吗?或者它主要是空的。如果它是空的,那么我怀疑是因为你需要单独提供iframe的内容。
答案 1 :(得分:0)
Web应用程序开发人员通常不太喜欢iframe。根据他们的建议,我使用“预期条件”添加了“等待”时间。之后,您可以获取标签的值。在这里我提到了val1。
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
.... #some code
.... #some code
wait(driver, 60).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'//*[@id="iframeid"]')))
.... #some code
.... #some code
val1 = wait(browser, 20).until(
EC.presence_of_element_located((By.XPATH,'//tr[(@cid="1")]/td[@ret="2" and @c="21"]')))
希望这会有所帮助!