Skip to content

文件上传弹框处理

文件上传弹窗处理

简介

有些场景中,需要上传文件,而 Selenium 无法定位到弹出的文件框,以及网页弹出的提醒。这些都是需要特殊的方式来处理。

⽂件上传

input 标签使用自动化上传,先定位到上传按钮,然后 send_keys(指定要上传的文件路径) 把路径作为值给传进去。

如图所示,是企业微信文件上传的页面定位到标签为 input,type 为 file 的元素信息,然后使用 send_keys 把文件路径作为值给传进去。

Python 实现

driver.find_element(By.CSS_SELECTOR, "#ww_fileInput js_file")\
    .send_keys("./hogwarts.png")

Java 实现

WebElement fileInput = driver.findElement(By.cssSelector("#ww_fileInput js_file"));
fileInput.sendKeys("./hogwarts.png");

弹窗处理

在页面操作中有时会遇到 JavaScript 所生成的 alert、confirm 以及 prompt 弹框,可以使用switch_to.alert()方法定位到。然后使用 text、accept、dismiss、send_keys 等方法进行操作。

操作弹窗常用的方法:

  1. switch_to.alert():获取当前页面上的警告框。

  2. text:返回 alert、confirm、prompt 中的文字信息。

  3. accept():接受现有警告框,即点击确定。

  4. dismiss():解散现有警告框,即点击取消。

  5. send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。

alert 弹框

输入一段文本点击比如提交按钮,会弹出确认内容的弹框。这种场景可以使用下面的方式处理:

Python 实现

"""Alert弹窗获取文本与确认操作"""

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 ec

def test_alert():
    driver = webdriver.Chrome()
    driver.get("http://sahitest.com/demo/alertTest.htm")
    driver.find_element(By.NAME, "b1").click()
    # 添加显式等待,等待弹框的出现
    WebDriverWait(driver, 5, 0.5).until(ec.alert_is_present())
    # 切换到弹框
    alert = driver.switch_to.alert
    # 打印弹框的文本
    print(alert.text)
    # 点击确定
    alert.accept()
    # 点击取消或者关闭弹框
    # alert.dismiss()

Java 实现

        driver.get("https://vip.ceshiren.com/#/ui_study/keypress");
        WebElement input = driver.findElement(By.className("el-input__inner"));
        input.click()
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        wait.until(ExpectedConditions.alertIsPresent());
        //将页面切换到弹窗,获取弹窗
        Alert alert = driver.switchTo().alert();
        //打印弹窗信息
        System.out.println(alert.getText());
        //点击弹窗确认
        alert.accept();

confirm 弹框

Python 实现

"""Prompt 弹窗获取文本、输入内容、确认操作"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait


def test_confirm():
    driver = webdriver.Chrome()
    driver.get("http://sahitest.com/demo/promptTest.htm")
    driver.find_element(By.NAME,"b1").click()
    #添加显式等待,等待弹框的出现
    WebDriverWait(driver, 5).until(ec.alert_is_present())
    #切换到弹框
    alert = driver.switch_to.alert
    #向弹框输入一段文本
    alert.send_keys('Selenium Alert弹出窗口输入信息')
    #点击确定
    alert.accept()

Java 实现

        driver.get("https://vip.ceshiren.com/#/ui_study/keypress");
        WebElement input = driver.findElement(By.className("el-input__inner"));
        input.click()
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        wait.until(ExpectedConditions.alertIsPresent());
        //将页面切换到弹窗,获取弹窗
        Alert alert = driver.switchTo().alert();
        //往弹窗输入一段文本
        alert.sendKeys("Selenium Alert弹出窗口输入信息");
        //点击弹窗确认
        alert.accept();

prompt 弹框

Python 实现

"""Confirm弹窗获取文本、确认、取消操作"""
import time

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 ec

def test_prompt():
    driver = webdriver.Chrome()
    driver.get("http://sahitest.com/demo/confirmTest.htm")
    driver.find_element(By.NAME,"b1").click()
    # 等待弹出窗口出现
    WebDriverWait(driver, 5).until(ec.alert_is_present())
    #切换到弹框
    alert = driver.switch_to.alert
    #点击确定
    # alert.accept()
    # time.sleep(2)
    #点击取消
    alert.dismiss()
    time.sleep(2)

Java 实现

        driver.get("https://vip.ceshiren.com/#/ui_study/keypress");
        WebElement input = driver.findElement(By.className("el-input__inner"));
        input.click()
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        wait.until(ExpectedConditions.alertIsPresent());
        //将页面切换到弹窗,获取弹窗
        Alert alert = driver.switchTo().alert();
        alert.dismiss();
        Thread.sleep(2000)

总结

通过往动作 sendkey 里输入特定格式的参数可以实现上传文件的功能。