【问题标题】:Selenium Webdriver - PhantomJS hangs upon send_keys() to file input elementSelenium Webdriver - PhantomJS 挂在 send_keys() 到文件输入元素
【发布时间】:2014-09-02 23:46:40
【问题描述】:

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

【问题讨论】:

  • 你能判断输入是否有多重属性
  • 输入确实有“多个”属性。
  • 当您执行 send.keys(file) 时,我对 PhantomJS 有同样的问题。我没有任何运气前进,我可以说的是硒并没有驱动html5页面那么好。我们不能使用 send_keys 直接设置输入的值。我们需要打开上传浏览器对话框窗口,如果你有一个,并使用 AutoIT 等外部自动化 API 填写文件路径,因为 webdriver 根本不知道对话框窗口,因为它在操作系统域级别下。我知道这很麻烦,但我尝试执行 javascript,Action builder 没有工作。
  • 另外,如果可能的话,尝试使用不同的浏览器,如 chrome 或 firefox,因为它易于调试,因为 phantomjs 是一个无头浏览器。
  • 即使没有“多个”元素也会发生

标签: python browser selenium-webdriver automation


【解决方案1】:

当我不能简单地更改文件输入标签的值时,我会使用这种方法。

我们将在控制台运行它,所以我们应该使用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

【讨论】:

    【解决方案2】:

    奇怪的是,我无法在我的 ubuntu shell 中运行任何东西,但它可以通过 iPython 从 Jupyter notebook 在完全相同的服务器上运行。

    我必须在代码中添加一个虚拟显示,以使其作为 .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()
    

    【讨论】:

      【解决方案3】:

      应该使用 PhantomJS.uploadFile()。但是,没有找到 python selenium API。

      var webPage = require('webpage');   
      var page = webPage.create();
      page.uploadFile('input[name=image]', '/path/to/some/photo.jpg');
      

      【讨论】:

        【解决方案4】:
        browser = webdriver.PhantomJS()
        browser.set_window_size(1200,800)
        

        如果不设置窗口大小,浏览器将保持移动大小,从而导致错误。也可以尝试隐式等待。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-27
          • 1970-01-01
          • 2014-12-05
          • 2015-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多