当元素位于iframe内置窗口下的时候,直接对元素定位是定位不到的,需要先切换到该窗口下:
示例代码:
想定位到iframe中的类型为“animal"的元素:
from playwright.sync_api import sync_playwright
p=sync_playwright().start()
browser=p.chromium.launch(headless=False)
page=browser.new_page()
page.goto("https://cdn2.byhy.net/files/selenium/sample2.html")
frame = page.frame_locator("iframe[src='sample1.html']")
# 再 在其内部进行定位
lcs = frame.locator('.animal').all()
playwright中切换窗口相较于selenium中的切换窗口switch_to.frame的优点在于,不用来回切换窗口:比如一个元素在iframe的框架外,另一个元素在iframe的框架内
那使用selenium的定位方法时,要先切换进去,在切换出来:
wd.switch_to.frame('innerFrame')
wd.switch_to.default_content()//切换回原来的窗口
但是使用playwright的话就不用,代码可以这样写:
先创建一个browsercontext对象context,再通过context创建page
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)
# 创建 BrowserContext 对象
context = browser.new_context()
# 通过context 创建page
page = context.new_page()
page.goto("https://cdn2.byhy.net/files/selenium/sample3.html")
# 点击链接,打开新窗口
page.locator("a").click()
# 等待2秒, 不能用 time.sleep
page.wait_for_timeout(2000)
# pages属性是 所有窗口对应Page对象的列表
for pg in context.pages:
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if '必应' in pg.title():
break
print(pg.title())
这样就不用来回切换窗口了