在某个窗口上点击某个链接在新标签页显示新窗口时,如果想要点击新标签页的元素时,需要进行窗口切换。
driver.switch_to.window('窗口名称')
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as when
class TestDemo:
def test_01(self):
with webdriver.Chrome(executable_path='chromedriver96.exe') as browser:
browser.implicitly_wait(10)
browser.get("http://www.baidu.com")
# input_el = browser.find_element('xpath', '//input[@id="kw"]')
# 引入By,会有相应提示,不容易出错
input_el = browser.find_element(By.XPATH, '//input[@id="kw"]')
input_el.send_keys('柠檬班')
# 找到搜索按钮
search_btn = browser.find_element(By.XPATH, '//input[@id="su"]')
# 点击搜索按钮
search_btn.click()
# 等待元素加载完成之后,再运行下面的代码
# 显性等待
# 1.获得等待器,设置倒计时
# 2.等待的条件出现
# 3.在超时前,如果等待条件出现了,就返回;如果等待条件没出现,就一直查找,直到报超时额错误
wait = WebDriverWait(browser, timeout=10)
# 元组形式传进去
condition = when.element_to_be_clickable((By.link_TEXT, 'lemon.ke.qq.com/'))
lemon_link = wait.until(condition)
# lemon_link = browser.find_element(By.link_TEXT, 'lemon.ke.qq.com/')
lemon_link.click()
# 获取所有的窗口,返回列表
print('打印所有的窗口列表', browser.window_handles)
# 有一个新页面生成
# 切换到新页面
browser.switch_to.window(browser.window_handles[-1])
# 打印当前窗口
print('打印当前窗口',browser.current_window_handle)
browser.find_element(By.CSS_SELECtOR, '.agency-content')
2.iframe页面
iframe是个子页面,如果想要定位iframe页面上的元素(排行榜),必须先切换到iframe页面上。
driver.switch_to.frame(params)--传值有三种形式,查看源码可知
- iframe的name属性的值
- 索引
- driver.find_element(),常用
首先本地创建带有iframe标签的html网页:
py44
hello python
想要引用本地创建的html网页时,需要在本地文件夹内打开html文件,获取浏览器的地址,不要在pycharm中打开(否则不能通过selenium打开)。
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestDemo:
def test_01(self):
with webdriver.Chrome(executable_path='chromedriver96.exe') as browser:
browser.implicitly_wait(10)
browser.get(
"file:///D:/PycharmProjects/Py44/day36_%E7%AD%89%E5%BE%85%E5%92%8C%E5%88%87%E6%8D%A2/iframe_web.html")
browser.find_element(By.ID, 'hello')
# 必须切换到iframe当中
iframe = browser.find_element(By.ID, 'i')
browser.switch_to.frame(iframe)
# iframe
browser.find_element(By.XPATH, '//span[contains(text(),"排行榜")]')
# 必须切换到iframe当中 iframe = browser.find_element(By.ID, 'i') browser.switch_to.frame(iframe) # 子页面的子页面,多层嵌套时,一层一层进去 sub_iframe = browser.find_element(By.ID, 'i') browser.switch_to.frame(sub_iframe) # 嵌套一个iframe时,切换回到主页面 browser.switch_to_default_content() # 多级时,切换到父级iframe页面, browser.switch_to_parent_content()3.alert页面
alert弹框出现后,如果要定位主页面的元素,必须先关闭alert弹框,返回到主页面,否则会报错。
browser.switch_to.alert.accept()
本地搭建html页面:
py44
hello python
想要引用本地创建的html网页时,需要在本地文件夹内打开html文件,获取浏览器的地址,不要在pycharm中打开(否则不能通过selenium打开)。
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestDemo:
def test_01(self):
with webdriver.Chrome(executable_path='chromedriver96.exe') as browser:
browser.implicitly_wait(10)
browser.get(
"file:///D:/PycharmProjects/day37_%E6%B5%8F%E8%A7%88%E5%99%A8%E6%93%8D%E4%BD%9C/alert.html")
el = browser.find_element(By.ID, 'hello')
el.click()
# 出现alert,无法再定位主页面
# 1.先切换到alert当中,点击确定
# 注意,alert后面没有括号,accept()确定,dimiss()取消
browser.switch_to.alert.accept()
el = browser.find_element(By.ID, 'hello')
实现弹框的方式:
- 原生的alert,prompt,样式很丑,现在很少用;
- 框架vue.js实现ui效果,弹框,就是普通的元素,不需要切换 。
toast:吐司
因为是通过js动态加载的,过特定时间消失,当出现时,使用source的暂停键,相当于js的debug,注意设置等待。
4.元素找不到可能的原因- 元素定位的表达式不正确,解决办法:浏览器中F12源代码中ctrl+f 进行表达式校验;
元素定位不要用动态生成值: 如果属性存在以下特性,做好不要用该值作为元素定位的依据: --属性值有数字; --存在加密字符,也有可能动态生成; --class里面有active、hidden等会变化的值。
- 没有等待或者是等待的时间不足,没有加载出来;
- 不在这个页面上(另外的窗口或者在一个iframe当中)。



