Selenium多表單切換switch_to.frame

Sonoop發表於2024-11-25

捋了捋還有那些需要自動打卡的站點,

結果發現52pojie的qq自動登入,

只用find_element的話找不到程式碼,

原因是 frame 巢狀頁面的應用,

WebDriver 每次只能在一個頁面上識別元素。

這個時候就需要透過 switch_to.frame(),

將當前定位的主體切換到 frame 裡在定位元素。

  • switch_to.frame() 預設可以直接取表單的 id 或 name 屬性進行切換。
#id = "if"
wd.switch_to.frame("if")
#name = "nf"
wd.switch_to.frame("nf")
  • 那麼如果 iframe 沒有可用的 id 和 name 可以先定位frame
#先透過 xpth 定位到 iframe
xf = wd.find_element_by_xpath('//*[@class="if"]')
#再將定位物件傳給 switch_to_frame()方法
wd.switch_to_frame(xf)
wd.switch_to_default_content()
  • 完成了當前表單的操作可透過switch_to.default_content()返回到上一層表單

QQ自動登入實現

def pojie():
    wd.get('https://www.52pojie.cn/index.php')
    # 跳轉qq登入介面
    wd.find_element(By.XPATH,'//div[@class="fastlg_fm y"]/p/a').click()
    wd.implicitly_wait(5)
    # 切換到frame
    wd.switch_to.frame('ptlogin_iframe')
    # 定位快捷登入賬號
    wd.find_element(By.XPATH,'//div[@id="qlogin_list"]/a').click()
    sleep(5)
    wd.find_element(By.XPATH,'//div[@id="um"]//p[2]/img').click()
    # wd.implicitly_wait(10)
    print('hifini.com簽到完成')
pojie()

相關文章