我正在执行一些文件上传测试。我发现如果我使用PhantomJS,我的测试代码挂在element.send_keys(file)
,但是如果我使用Firefox,相同的代码不会挂起。
element = self.browser.find_element_by_xpath("//input[@type='file']")
element.send_keys(file)
是否有任何解决方法使PhantomJS上传文件正确?目前我使用的是Windows 7, Python 3.4.1, selenium 2.42.1, PhantomJS 1.9.7.
browser = webdriver.PhantomJS()
browser.set_window_size(1200,800)
未设置窗口大小,浏览器保持移动大小,导致错误。
应该使用PhantomJS.uploadFile()。但是,没有找到python selenium API。
var webPage = require('webpage');
var page = webPage.create();
page.uploadFile('input[name=image]', '/path/to/some/photo.jpg');
奇怪的是,我无法在我的ubuntu shell中运行任何东西,但它可以在同一台服务器上的Jupyter笔记本上通过iPython运行。
我必须在代码中添加一个虚拟显示,以使它作为。py脚本从shell运行…
如果它帮助任何人面对类似的问题,这里是我添加到我的脚本和发送键开始工作没有问题的代码行。
from pyvirtualdisplay import Display
# Set screen resolution to 1366 x 768 like most 15" laptops. This is needed
#to run in the shell. Seems fine in iPython
display = Display(visible=0, size=(1366, 768))
display.start()
当我不能简单地改变文件输入标记的值时,我使用这种方法。
我们将运行它的控制台,所以我们应该使用PyVirtualDisplay与窗口管理器(我使用dwm,你可以尝试fluxbox它很容易安装,但需要更多的RAM然后dwm)和Xephyr调试。要运行窗口管理器,我们将使用EasyProcess
所以我们将调用文件上传对话框,通过点击元素或按钮,然后我们用pynput和所有这些在我们的控制台中运行模拟发送密钥。
import time
from easyprocess import EasyProcess
from pynput.keyboard import Key, Controller
from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
class ImageUploadAutomation:
chrome = 'path/to/chrome'
chrome_options = Options()
# chrome_options.add_argument('--headless')
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-notifications")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--window-size=1280,900")
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("user-data-dir=selenium")
chrome_options.add_experimental_option(
"excludeSwitches", ["disable-popup-blocking"]
)
chrome_options.add_argument(
"--disable-blink-features=AutomationControlled"
)
driver = None
def upload(self, photo):
# Change visible to 1 if you want to use Xephyr debug
with Display(visible=0, size=(1280, 900)) as display:
with EasyProcess(["dwm"]) as process:
keyboard = Controller()
url = "https://www.exmaple.com"
self.driver = webdriver.Chrome(
executable_path=self.chrome,
chrome_options=self.chrome_options
)
self.driver.get(url)
test = self.driver.find_element_by_xpath(
"//div[@aria-label='Add Photos']"
)
time.sleep(1)
test.click()
time.sleep(1)
for key in photo.path:
keyboard.press(key)
keyboard.release(key)
# keyboard.press(Key.enter)
with keyboard.pressed(Key.enter):
pass