selenium 多窗口处理与网页frame

2021-06-29 03:03

阅读:268

标签:tps   输入   sub   eset   关闭浏览器   ddr   res   find   wait   

多窗口处理

点击某些链接,会重新打开一个窗口,对于这种情况。想在薪页面操作,就得先切换窗口了。
获取窗口得唯一标识用句柄表示,所以只需要切换句柄,就可以在多个页面进行操作了

1、 先获取到当前得窗口句柄(drive.current_window_handle)
2、 再获取到所有得窗口句柄(drive.window_handles)
3、 判断是否是想要操作得窗口,如果是,就可以对窗口进行操作,如果不是。就跳转到另外一个窗口,对另一个操作进行操作(drive.switch_to_window)

Demo

操作步骤
1、打开百度,
2、点击登录
3、在弹出框点击注册账号
4、跳到注册账号页,输入用户名和账号
5、返回第一个登录页
6、在登录页输入账号密码,点击登录

import pytest
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import TouchActions


class TestActions:
    def setup(self):
        self.chrome_options = Options()
        self.chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")  # 指定配置好的 chrom
        self.chrome_options.add_experimental_option("w3c", False)
        self.chrome_driver = r"./chromedriver.exe"  # 驱动路径
        self.driver = webdriver.Chrome(self.chrome_driver, chrome_options=self.chrome_options)  # 加入驱动设置
        # self.driver.get(‘https://sahitest.com/demo/clicks.htm‘)  # 发起请求
        # self.driver.maximize_window()  # 设置为最大化
        self.driver.implicitly_wait(3)  # 添加一个隐式等待默认等待3秒

    def teardown(self):
        print(‘关闭浏览器‘)
        # time.sleep(1)
        # self.driver.quit()

    def test_login(self):
        url = ‘https://www.baidu.com/‘
        self.driver.get(url)  # 发起请求
        self.driver.find_element_by_xpath("//a[@id=‘s-top-loginbtn‘]").click()  # 点击登录
        self.driver.find_element_by_xpath("//a[contains(text(),‘立即注册‘)]").click()  # 点击立即注册
        print(self.driver.window_handles)  # 查看目前有几个页面
        window1 = self.driver.current_window_handle  # 目前选中得页面
        self.driver.switch_to_window(self.driver.window_handles[-1])
        window2 = self.driver.current_window_handle  # 选择新打开得页面
        print(window2, window1)
        # 在第二个页面输入账号密码
        self.driver.find_element_by_xpath("//input[@id=‘TANGRAM__PSP_4__userName‘]").send_keys(‘1311111‘)
        self.driver.find_element_by_xpath("//input[@id=‘TANGRAM__PSP_4__phone‘]").send_keys(‘1311111‘)
        # 返回第一个页面,然后点击立即登录
        self.driver.switch_to_window(window1)  # 因为上面步骤已经将window1记录了下来,所以可以直接选择window1
        self.driver.find_element_by_xpath("//p[@id=‘TANGRAM__PSP_11__footerULoginBtn‘]").click()  # 点击登录
        self.driver.find_element_by_xpath("//input[@id=‘TANGRAM__PSP_11__userName‘]").send_keys("lakes")  # 输入账号
        self.driver.find_element_by_xpath("//input[@id=‘TANGRAM__PSP_11__password‘]").send_keys("lakes")  # 输入密码
        self.driver.find_element_by_xpath("//input[@id=‘TANGRAM__PSP_11__submit‘]").click()  # 点击登录

if __name__ == ‘__main__‘:
    pytest.main([‘-vs‘, "test_action.py::TestActions"])

frame的处理

在web自动化中,如果一个元素定位不到,那么很大可能这个元素在iframe中

Frame分类

标签主要表现为 : frameset、frame、 iframe 三种

frame 存在两种

  • 一种是嵌套的,一种是未嵌套的

切换嵌套的frame

  • driver.switch_to.frame() # 根据元素id或者index 切换成frame
  • driver.switch_to.default_content() # 切换到默认的frame
  • driver.stitch_to.parent_frame() # 切换到父级frame

切换未嵌套的frame

  • driver.switch_to_frame("frame的id")
  • driver.switch_to_frame("frame-index") frame无id的时候要根据索引来处理,索引从0开始 driver.switch_to_frame(0)

用法:
切换到所在的frame, 就可以通过selenium的定位定位到

selenium 多窗口处理与网页frame

标签:tps   输入   sub   eset   关闭浏览器   ddr   res   find   wait   

原文地址:https://www.cnblogs.com/c-keke/p/14942162.html


评论


亲,登录后才可以留言!