问题描述
...
<div class="media ipad_media" style="padding-top: 0;">
<iframe src="//www.youtube.com/embed/XXXXXXXX" frameborder="0" allowfullscreen="allowfullscreen" width="618" height="330" data-gtm-yt-inspected-7182449_30="true">
</iframe>
<div>
...
<div class="media ipad_media hidden-xs">
<iframe src="//www.youtube.com/embed/XXXXXXXX" frameborder="0" allowfullscreen="allowfullscreen" width="618" height="330" data-gtm-yt-inspected-7182449_30="true">
</iframe>
</div>
我想要 src
属性,它在两个 iframes
中实际上是相同的。我只是使用以下命令定位第一个元素:
elem = driver.find_element_by_class_name("media.ipad_media").find_element_by_tag_name("iframe")
然后我执行以下操作:
print(elem.get_attribute('width'))
print(elem.get_attribute('frameborder'))
print(elem.get_attribute('allowfullscreen'))
print(elem.get_attribute('src'))
print(elem.get_attribute('source'))
print(elem.text)
print(elem.tag_name)
我在控制台中得到以下信息:
618
0
true
None
iframe
怎么可能在执行 print(elem.get_attribute('src'))
时什么都不做?如您所知,在控制台中执行 $$("div.media.ipad_media>iframe")
命令会得到 2
解决方法
<div>
标签是所需 <iframe>
标签的直接祖先。
要打印 src
的 <iframe>
属性的值,您可以使用以下任一 Locator Strategies:
-
使用
css_selector
:print(driver.find_element_by_css_selector("div.media.ipad_media > iframe").get_attribute("src"))
-
使用
xpath
:print(driver.find_element_by_xpath("//div[@class='media ipad_media']/iframe").get_attribute("src"))
理想情况下,您需要为 visibility_of_element_located()
引入 WebDriverWait,并且您可以使用以下任一 Locator Strategies:
-
使用
CSS_SELECTOR
:print(WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"div.media.ipad_media > iframe"))).get_attribute("src"))
-
使用
XPATH
:print(WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='media ipad_media']/iframe"))).get_attribute("src"))
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC