Python Selenium Webdriver:找到#document元素

时间:2014-06-23 07:01:43

标签: python selenium xpath selenium-webdriver webdriver

我一直在使用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>

2 个答案:

答案 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"]')))

希望这会有所帮助!