多表单处理

"""
多表单:
一个页面中可以嵌套另一个页面,webdiriver对象只能在一个页面(外层是默认的)定位,
需要一种方式将driver对象从外层切换到内层对象进行处理
webdriver中提供API:driver.switch_to.frame()实现
案例
1、打开腾讯首页:http://www.qq.com
2、点击邮箱图标
3、输入用户名
4、输入密码
5、点击登陆
6、关闭浏览器

"""
# 导包,创建浏览器对象
# 1、打开腾讯首页:http://www.qq.com
from selenium import webdriver
import time

driver=webdriver.Chrome()
driver.get("http://www.qq.com")
# 2、点击邮箱图标
driver.find_element_by_xpath("//*[@id='top-login']/div[2]/a").click()
# 跳转到邮箱登陆界面(窗口),涉及到多窗口处理
handles =driver.window_handles
# print(handles)
# ['CDwindow-1F80ABDD90C99E364BBDEDE7A007E666', 'CDwindow-49123408724FDD9FF1114CE9C606FBBB']
driver.switch_to_window(handles[1])
# 验证窗口跳转是否成功
# driver.find_element_by_link_text("基本版").click()
# time.sleep(3)
# 3、输入用户名
time.sleep(3)
# 涉及多表单处理,内层识别不到,怎么办
# webdriver 中提供API:driver.switch_to.frame()实现
# # 第一种方法,默认的ID或者name都可以,找到iframe标签,整个页面放于这里
# driver.switch_to_frame("login_frame")

# 第二种方法,可以传参数iframe的元素对象
iframeobj =driver.find_element_by_xpath("//*[@id='login_frame']")
driver.switch_to_frame(iframeobj)

driver.find_element_by_link_text("帐号密码登录").click()
driver.find_element_by_xpath("//*[@id='u']").send_keys("XXXX自己的QQ号")

# 4、输入密码
driver.find_element_by_xpath("//*[@id='p']").send_keys("XXXX自己的QQ密码")
# 5、点击登陆
driver.find_element_by_xpath("//*[@id='login_button']").click()
time.sleep(2)
# 6、关闭浏览器
driver.quit()

元素等待

"""
元素等待:
webdriver提供了三种等待方法:
强制等待:
time.sleep(5),单位秒,直接让线程休眠,这几秒什么也不干


隐式等待:
在脚本创建driver对象之后,给driver设置一个全局等待时间,
对driver的整个生命周期(创建到关闭)都起效果。
如果在设置的等待时间(超出时间)内,定位到了页面元素,则不再等待,继续执行下面代码
如果超出等待时间,则抛出异常
driver.implicity_wait(10)
注意:在使用隐式等待实际上浏览器会在自己设置的等待时间内不断刷新页面去寻找
要求在后续写代码时候,全部加上这句话


显示等待:
等到元素出现才操作,如果超时则抛出异常
构造WebDriverWait一个对象
WebDriverWait(driver,timeout,pool_frequency=0.5,ignored_exceptions=None)
until(method,info):直到满足某一个条件,返回结果,等不到报错
method--->expected_conditions.presence_of_element_located(locator):判断是不是定位到了
locator---》By.Id,By.Name
需求:显示等待去等百度首页。显示出来就点击,否则print

如果同时设置了显示等待和隐式等待,以隐式等待为第一级,对time.sleep()没有影响


"""
from selenium import webdriver
# ui模块,WebDriverWait一个类
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver =webdriver.Chrome()
# driver.implicitly_wait(10)

driver.get("https://www.baidu.com")


# 找百度文本框
e =WebDriverWait(driver,10,0.5,None).until(EC.presence_of_element_located((By.ID,"kw")),"找不到")
# print(e)
# if e.is_displayed():
#     print("唉")

if e:
    e.send_keys("nb")
    time.sleep(4)
else:
    print(e)

driver.quit()