美文网首页
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