我想用 selenium 和 python 发送电子邮件

时间:2021-05-08 15:22:29

标签: python selenium

我想用 selenium 和 python 自动化 Gmail,一切正常,但这里的问题在于文件附件。我怎么办?

需要解决这些步骤:

  1. 点击电子邮件中的文件附件按钮撰写正文。
  2. 选择本地文件上传

这是我当前的代码:

import React, {Fragment,useEffect,useState} from 'react';
import './App.css';
import Navbar from './components/layout/Navbar';
import Register from './components/auth/Register';
import Login from './components/auth/Login';
import Landing from './components/layout/Landing';
import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; 
import Alert from './components/layout/Alert';
import {loadUser} from './actions/auth';
import setAuthToken from './utils/setAuthToken';
import Dashboard from './components/dashboard/Dashboard';
import PrivateRoute from './components/routing/PrivateRoute';
import CreateProfile from './components/profile-forms/CreateProfile';
import Profiles from './components/profiles/Profiles';
import Profile from './components/profile/Profile';
import Posts from './components/posts/Posts';
import Post from './components/post/Post';
import PostsAdmin from './components/posts/PostsAdmin';
import EditProfile from './components/profile-forms/EditProfile';
import AddExperience from './components/profile-forms/AddExperience';
import AddEducation from './components/profile-forms/AddEducation';
import SideBar from './components/sideBar/SideBar'


//Redux
import {Provider} from 'react-redux';
import store from './store';


if(localStorage.token){
  setAuthToken(localStorage.token);
}
const App =() => {
  useEffect(() =>{
    store.dispatch(loadUser());
  },[]);
  return (
    <Provider store={store}>
  <Router>
    <Fragment>
      <Navbar/>
      <Route exact path ='/' component={Landing}/>
      <section className={store.getState().auth.isAuthenticated ?"container2":"container"}>
        <Alert/>
        <switch>
          <Route exact path="/register" component={Register}/>
          <Route exact path="/login" component={Login}/>
          <Route exact path='/profiles' component={Profiles}/>
          <Route exact path='/Posts' component={Posts}/>
          <Route exact path='/profile/:id' component={Profile}/>
          <Route exact path='/posts/:id' component={Post}/>
          <PrivateRoute exact path="/dashboard" component={Dashboard}/>
          <PrivateRoute exact path="/admin" component={PostsAdmin}/>
          <PrivateRoute exact path="/create-profile" component={CreateProfile}/>
          <PrivateRoute exact path="/edit-profile" component={EditProfile}/>
          <PrivateRoute exact path="/add-experience" component={AddExperience}/>
          <PrivateRoute exact path="/add-education" component={AddEducation}/>
          
        </switch>
      </section>
    </Fragment>
    </Router>
    </Provider>
  );
}


export default App

1 个答案:

答案 0 :(得分:0)

selenium 处理文件上传的方式有点老套。 WebDriver 只能与您的浏览器交互,而不能与用于搜索文件系统附件的窗口交互。但是,如果您确实需要,可以提供一种方法来执行此操作。您只需识别文件输入元素,然后使用 fileInputElement.send_keys('abs/path/to/the/file/you/want/to/attach')

识别该元素有点棘手。但是它可以通过 CSS 选择器 ('input[type="file"]') 来识别。找到该元素后,我们发现它已被禁用。但是,我们可以执行一些 Javascript 来解决这个问题。所以你最终会得到类似

fileInputElement = driver.find_element_by_css_selector('input[type="file"]')
driver.execute_script("((el) => el.style.display = 'block', fileInputElement)")
fileInputElement.send_keys('abs/path/to/attachment/file')

尝试在执行脚本之后添加一个等待可见的函数,以确保它不是时间问题。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

fileInputElement = driver.find_element_by_css_selector('input[type="file"]')
driver.execute_script("((el) => el.style.display = 'block', fileInputElement)")
element = WebDriverWait(driver, 10).until(
        EC.visibility_of(fileInputElement)
    )
element.send_keys('abs/path/to/attachment/file')
相关问题