页面基本定位
https://www.cnblogs.com/070727sun/p/12368636.html
页面基本操作
https://www.cnblogs.com/070727sun/p/12369788.html
多窗口处理
方法:首先获取到目的页面的句柄,然后获取到所有页面的句柄。然后使用driver.switch_to_windows切换到对应的页面的地址。
1、获取到当前的窗口的句柄(driver.current_window_handle)
2、获取到所有的窗口句柄(driver.window_handles)——>返回值是数组
3、切换到另一个窗口的句柄(driver.switch_to_window)
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
class TestHandle():
def setup(self):
self.drive = webdriver.Chrome()
self.drive.implicitly_wait(5)
self.drive.get('https://www.baidu.com/')
self.drive.maximize_window()
def teardown(self):
self.drive.quit()
def test_01(self):
current_handle = self.drive.current_window_handle
print(f'当前的句柄: {current_handle}')
self.drive.find_element_by_class_name('s-top-left.s-isindex-wrap a:nth-child(1)').click()
handles = self.drive.window_handles
print(f'所有句柄: {handles}')
sleep(2)
self.drive.switch_to.window(handles[1])
# content = self.drive.find_element_by_id("headline-tabs").text
# content = self.drive.find_element_by_link_text('国内').text
content = self.drive.find_element(By.ID,"headline-tabs").text
print(f'获取的标题: {content}')
sleep(2)
if __name__ == '__main__':
pytest.main()
iframe处理
frame介绍
在web自动化中,如果一个元素定位不到,那么很有可能是在iframe中。
什么是frame?
1、frame是html中的框架,在html中,所谓的框架就死活可以在同一个浏览器中显示不止一个页面。
2、基于html的框架,又分为垂直框架和水平框架(cols,rows)
Frame分类
1、frame标签包含frameset、frame、iframe三种
2、frameset和普通的标签一样,不会影响正常的定位,可以使用index、id、name、webelement任意方式定位。
3、而frame与iframe对selenium定位而言是一样的。selenium有一组方法对frame进行操作。
演示:https://www.runoob.com/tags/tag-iframe.html
https://www.w3school.com.cn/tags/tag_frameset.asp
frame切换
frame分为两种:一种是嵌套的 2、一种是未嵌套的
切换frame方法
1、driver.switch_to.frame() # 根据元素id或者index切换frame
2、dirver.switch_to.default_content() # 切换到默认frame
3、driver.switch_to.parent_frame() # 切换到父级frame
使用方法
未嵌套
dirver.switch_to_frame(“frame的id”)
driver.switch_to_frame(“frame-index”)frame无ID的时候依据索引来处理,索引从0开始driver.switch_to_frame(0)
嵌套的iframe
对于嵌套的先进入到iframe的父节点,再进到子节点,然后可以对子节点里面的对象进行处理和操作
driver.switch_to.frame(“父节点”)
driver.switch_to.frame(“子节点”)
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestIframe():
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get('https://www.runoob.com/try/try.php?filename=tryjsref_ondrop')
self.driver.maximize_window()
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_iframe(self):
# 进入iframe前,先切换进入
self.driver.switch_to.frame('iframeResult')
print(self.driver.find_element(By.ID,'dragtarget').text)
# 进入后切换回来 下面两种方式均可
# self.drive.switch_to.parent_frame() # 返回到父节点
self.driver.switch_to.default_content() # 返回到 默认节点,也就是最外层的
print(self.driver.find_element_by_id('submitBTN').text)
if __name__ == '__main__':
pytest.main()
多浏览器处理
chrome,Firefox,headless等浏览器的自动化支持
传不同参数来测试不同的浏览器,用来做浏览器的兼容性测试
from selenium import webdriver
import os
class Base():
def setup(self):
browser = os.getenv("browser") # getenv(参数)函数是一个用于获取环境变量的函数 运行是要给参数browser = firefox
if browser == 'firefox':
self.driver = webdriver.Firefox()
elif browser == 'headless':
self.driver = webdriver.PhantomJS()
else:
self.driver = webdriver.Chrome()
def teardown(self):
self.driver.quit()
运行: browser=firefox pytest test_frame.py
执行jsvascript脚本
使用selenium直接在当前页面中进行js交互
常见的几种操作使用js实现
selenium能够执行js,这使得selenium拥有更为强大的能力,既然能执行js,那么js能做的事,selenium应该大部分也能做
直接使用js操作页面,能解决很多clicj()不生效的问题
页面滚动到底部,顶部
处理富文本,时间控件的输入
selenium中如何调用js
1、execute_script:执行js
2、return:可以返回js的返回结果
3、execute_script:arguments传参
import pytest
import time
from base import Base
class Test_JS(Base):
def test_01_js_scroll(self):
self.drive.get('https://www.baidu.com/')
self.drive.find_element_by_id('kw').send_keys('测试')
element = self.drive.execute_script('return document.getElementById("su")')
element.click()
self.drive.execute_script('document.documentElement.scrollTop=1000')
time.sleep(2)
print(self.drive.execute_script('return JSON.stringify(performance.timing)'))
if __name__ == '__main__':
pytest.main()
时间控件
大部分时间控件都是readonly属性,需要手动去选择对应的时间,手工测试中很容易做到,自动化中控件的时间总可以使用js来操作。
处理时间控件思路:
1、要取消日期的readonly属性
2、给value赋值
写js代码来实现如上的1、2,再webdriver对js进行处理。
import pytest
import time
from base import Base
class Test_JS(Base):
def test_02_js_datetime(self):
self.drive.get('https://www.12306.cn/index/')
self.drive.execute_script('return document.getElementById("train_date")')
self.drive.execute_script('document.getElementById("train_date").removeAttribute("readonly")')
time.sleep(4)
print(self.drive.execute_script('document.getElementById("train_date").value="2021-09-09"'))
time.sleep(10)
上传文件
input标签可以直接使用send_keys(文件地址)上传文件
用法:
el=driver.find_element_by_id(“上传按钮id”)
el.send_keys(“文件路径+文件名”)
def test_03_upload(self):
self.drive.get('https://www.baidu.com/')
self.drive.find_element_by_class_name('soutu-btn').click()
time.sleep(2)
self.drive.find_element_by_class_name('upload-pic').send_keys('/Users/...../1.png')
time.sleep(2)
弹框处理
在页面操作中有时会遇到JavaScript所产生的alert、confirm以及prompt弹框,可以使用switch_to.alert()方法定位到。然后使用text/accept/dismiss/send_keys等方法进行操作。参考教你分辨alert、window、div模态框,及操作。
操作alert常用的方法:
1、switch_to.alert():获取当前页面上的告警框
2、text:返回alert/confirm/prompt中的文字信息
3、accept():接受现有的告警框
4、dismiss():解散现有的告警框
send_key(keysToSend):发送文本至警告框。keysToSend:将文本发送至告警框。
from selenium.webdriver import ActionChains
from base import Base
from time import sleep
import pytest
class Test_alert(Base):
def test_01_alert(self):
self.driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
self.driver.switch_to.frame('iframeResult') # 切换到对应的iframe
# 操作拖拽
drag = self.driver.find_element_by_id('draggable')
drop = self.driver.find_element_by_id('droppable')
action = ActionChains(self.driver)
action.drag_and_drop(drag,drop).perform()
sleep(2)
print('点击alert')
# 获取到对应弹窗的文本
print(self.driver.switch_to.alert.text)
# 点击弹窗的"确认"键
self.driver.switch_to.alert.accept()
# 切回iframe
self.driver.switch_to.default_content()
# 打印"点击运行"按钮文本
print(self.driver.find_element_by_id('submitBTN'))
sleep(2)
if __name__ == '__main__':
pytest.main()