Python Selenium Webdriver: 查找 #document 元素
我一直在使用Python的Selenium Webdriver来获取一些元素,这些元素是用特定的HTML代码写的。不过,我发现我无法访问这个#document标签里面的任何元素。
我尝试了两种方法:第一种是用
driver.find_element_by_xpath("html/body/div[@id='frame']/iframe/*")
,第二种是先找到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>
2 个回答
0
一般来说,网页应用开发者对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"]')))
希望这对你有帮助!
8
切换到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的内容。