一、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)
网友评论