Selenium Webdriver语言 - PhantomJS挂起send_keys()到文件输入元素



我正在执行一些文件上传测试。我发现如果我使用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

最新更新