美文网首页
selenium爬iframe页面

selenium爬iframe页面

作者: 王文强Python | 来源:发表于2020-07-11 17:51 被阅读0次

一、ifram嵌套页面

在chrome中xpath定位表达式能定位到元素,说明这个定位表达式没问题。
很大的可能性是因为元素放在frame或者iframe中,导致定位不到
分析定位元素的层级,可以看到,邮箱输入框果然是在iframe中
下面是登陆页面和发送页面的截图


2.png 1.png
1、id是动态生成时 使用 CSSSelector 正则匹配头部 id
注意看这里  id="x-URS-iframe1594458860030.987"  的匹配方式
使用CSSSelector正则匹配头部
elem = driver.find_element_by_css_selector("iframe[id^='x-URS-iframe']")
2、通过id或者 鼠标反键【 copy full Xapth】 来定位后使用switch_to_frame进入 ifram
第一种方法:
# 使用CSSSelector正则匹配头部
elem = driver.find_element_by_css_selector("iframe[id^='x-URS-iframe']")
 # 163登陆框是使用iframe进行嵌套的,所以需要先切换到该iframe
driver.switch_to.frame(elem)
acount = driver.find_element_by_name('email')


第二种方法:
# 先定位到iframe
iframepath = '/html/body/div[2]/div[1]/div[2]/div[1]/section/section/div/div[1]/div[1]/div[2]/iframe'
elem = driver.find_element_by_xpath(iframepath)
# 再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(elem)
neirong = driver.find_element_by_xpath('/html/body/p') #再去找到输入内容所在的路径
3、如果完成操作后,可以通过switch_to.parent_content()方法跳出当前iframe,或者还可以通过switch_to.default_content()方法跳回最外层的页面。
driver.switch_to.default_content()   #退出ifram
# driver.switch_to.parent_content()  #退出ifram的另外一种方法

# 只要存在iframe的页面都要使用完整路径
path3 = '/html/body/div[2]/div[1]/div[2]/div[1]/section/footer/div[1]/span[2]'
fs = driver.find_element_by_xpath(path3)
fs.click()

二、下面是完整代码

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# WebDriverWait 负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions负责条件
from selenium.webdriver.support import expected_conditions as EC


def login():
    acount_num = input('请输入账号:\n')
    passwd_str = input('请输入密码:\n')
    driver = webdriver.Chrome()   #使用有界面模式

    # 下面四行代码是使用无界面模式
    #chrome_options = Options()
    #chrome_options.add_argument('--headless')
    #chrome_options.add_argument('--disable-gpu')
    #driver = webdriver.Chrome(chrome_options=chrome_options)

    url = 'http://mail.163.com/'
    driver.get(url)
    try:
        # 显示等待控件出现
        element = WebDriverWait(driver,10).until(
            EC.presence_of_all_elements_located(By.ID,'normalLoginTab')
        )
    finally:
        driver.quit()

    # 注意看这里  id="x-URS-iframe1594458860030.987"  的匹配方式
    # 使用CSSSelector正则匹配头部
    elem = driver.find_element_by_css_selector("iframe[id^='x-URS-iframe']")
    # 163登陆框是使用iframe进行嵌套的,所以需要先切换到该iframe
    driver.switch_to.frame(elem)

    acount = driver.find_element_by_name('email')
    acount.clear()
    acount.send_keys(acount_num)

    passwd = driver.find_element_by_name('password')
    passwd.clear()
    passwd.send_keys(passwd_str)

    time.sleep(3)
    click_button = driver.find_element_by_id('dologin')
    click_button.click()
    time.sleep(3)
    return driver


def xiexin(driver):
    xiexin_element = driver.find_element_by_xpath('//*[@id="_mail_component_24_24"]/span[2]')
    xiexin_element.click()
    time.sleep(5)

    # 当有iframe时使用鼠标点反键选择【copy full Xapth】复制完整xpath路径
    path1 = '/html/body/div[2]/div[1]/div[2]/div[1]/section/header/div[1]/div[1]/div/div[2]/div/input'
    shoujianren = driver.find_element_by_xpath(path1)
    shoujianren.send_keys('1377****95@qq.com')
    time.sleep(2)
    path2 = '/html/body/div[2]/div[1]/div[2]/div[1]/section/header/div[2]/div[1]/div/div/input'
    title = driver.find_element_by_xpath(path2)
    title.send_keys('无界面测试邮件')
    time.sleep(2)

    # 先定位到iframe
    iframepath = '/html/body/div[2]/div[1]/div[2]/div[1]/section/section/div/div[1]/div[1]/div[2]/iframe'
    elementi = driver.find_element_by_xpath(iframepath)
    # 再将定位对象传给switch_to_frame()方法
    driver.switch_to_frame(elementi)

    neirong = driver.find_element_by_xpath('/html/body/p')
    text = """
        使用selenium 无界面模式在163邮箱中发送一封邮件,
        使用selenium 无界面模式在163邮箱中发送一封邮件,
        使用selenium 无界面模式在163邮箱中发送一封邮件,
        使用selenium 无界面模式在163邮箱中发送一封邮件,
        使用selenium 无界面模式在163邮箱中发送一封邮件,
        使用selenium 无界面模式在163邮箱中发送一封邮件,
        使用selenium 无界面模式在163邮箱中发送一封邮件,

    """
    neirong.send_keys(text)
    time.sleep(2)
    driver.switch_to.default_content()   #退出ifram
    # driver.switch_to.parent_content()  #退出ifram的另外一种方法

    # 同样也要使用完整路径
    path3 = '/html/body/div[2]/div[1]/div[2]/div[1]/section/footer/div[1]/span[2]'
    fs = driver.find_element_by_xpath(path3)
    fs.click()
    print('发送完毕')


if __name__ == '__main__':
    driver = login()
    xiexin(driver)

相关文章

网友评论

      本文标题:selenium爬iframe页面

      本文链接:https://www.haomeiwen.com/subject/ckvicktx.html