Python Selenium Webdriver: 查找 #document 元素

5 投票
2 回答
9500 浏览
提问于 2025-04-18 10:44

我一直在使用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的内容。

撰写回答