Skip to content

Instantly share code, notes, and snippets.

@datakurre
Last active December 18, 2017 10:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save datakurre/7e9fcf66e542f345aa3e933bd3ea7e6a to your computer and use it in GitHub Desktop.
Save datakurre/7e9fcf66e542f345aa3e933bd3ea7e6a to your computer and use it in GitHub Desktop.
nix-shell for Plone buildout with Selenium tests
#!/usr/bin/env nix-shell
{ rev ? "beb1f1ea91ef15d5f1b272108b0cf964e47665f2"
, sha256 ? "02n73jmc0vbb2dq5af70zxms63jbgbnzc70fmw50mcq07fpwa3p9"
, pkgs ? import ((import <nixpkgs> {}).pkgs.fetchFromGitHub {
owner = "NixOS";
repo = "nixpkgs";
inherit rev;
inherit sha256;
}) {}
, pythonPackages ? pkgs.python27Packages
}:
with pkgs;
with pkgs.rustPlatform;
let self = rec {
geckodriver = buildRustPackage rec {
version = "0.18.0";
name = "geckodriver-${version}";
src = fetchurl {
url = "https://github.com/mozilla/geckodriver/archive/v0.18.0.tar.gz";
sha256 = "1qlpdm24r80sf94sg4mg5wph4gc0fa2x9w8zxw2wl7bw0zvbp9d2";
};
depsSha256 = "1b1vwqnxqrlcxm4p7ykvn4xhl44017z9d8c5y5qs3f8jjxf7870z";
};
selenium = pythonPackages.selenium.overrideDerivation (old: rec {
pname = "selenium";
version = "3.6.0";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "15qpvz0bdwjvpcj11fm0rw6r5inr66sqw89ww50l025sbhf04qwm";
};
patches = [
(builtins.toFile "fix_profiledir_permissions.patch" ''
--- a/selenium/webdriver/firefox/firefox_profile.py 2016-01-13 11:32:42.000000000 +0200
+++ b/selenium/webdriver/firefox/firefox_profile.py 2016-01-13 11:32:12.000000000 +0200
@@ -77,6 +77,7 @@
shutil.copytree(self.profile_dir, newprof,
ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock"))
self.profile_dir = newprof
+ os.chmod(self.profile_dir, 0755)
self._read_existing_userjs(os.path.join(self.profile_dir, "user.js"))
self.extensionsDir = os.path.join(self.profile_dir, "extensions")
self.userPrefs = os.path.join(self.profile_dir, "user.js")
@@ -172,6 +172,6 @@
for base, dirs, files in os.walk(self.path):
for fyle in files:
filename = os.path.join(base, fyle)
- zipped.write(filename, filename[path_root:])
+ zipped.writestr(open(filename).read(), filename[path_root:])
zipped.close()
return base64.b64encode(fp.getvalue()).decode('UTF-8')
--- a/selenium/webdriver/remote/webdriver.py 2016-01-13 11:32:42.000000000 +0200
+++ b/selenium/webdriver/remote/webdriver.py 2016-01-13 11:32:12.000000000 +0200
@@ -224,6 +224,18 @@
else:
capabilities.update({'firefox_profile': browser_profile.encoded})
+ try:
+ del capabilities['moz:firefoxOptions']['profile']
+ except KeyError:
+ pass
+# import sys; import pdb
+# for attr in ('stdin', 'stdout', 'stderr'):
+# setattr(sys, attr, getattr(sys, '__%s__' % attr))
+# pdb.set_trace()
+ try:
+ capabilities['moz:firefoxOptions']['prefs'] = {"dom.file.createInChild": True}
+ except KeyError:
+ pass
w3c_caps = _make_w3c_caps(capabilities)
parameters = {"capabilities": w3c_caps,
"desiredCapabilities": capabilities}
response = self.execute(Command.NEW_SESSION, parameters)
'')
];
prePatch = ''
mkdir -p py
cp -R selenium py/selenium
'';
patchPhase = null;
postPatch = old.patchPhase;
propagatedBuildInputs = old.propagatedBuildInputs ++ [
geckodriver
];
});
robotframework-seleniumlibrary = pythonPackages.robotframework-selenium2library.overrideDerivation(old: rec {
pname = "robotframework-seleniumlibrary";
version = "3.0.0b1";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "b5449d0e0a44141c2216cdb68c4b7e12a9c2efcc4e2dda48c5c501eb3fdf3dc8";
};
propagatedBuildInputs = [
selenium
pythonPackages.decorator
pythonPackages.docutils
pythonPackages.robotframework
];
});
robotframework-selenium2library = pythonPackages.robotframework-selenium2library.overrideDerivation(old: rec {
pname = "robotframework-selenium2library";
version = "3.0.0b1";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "a6160fad98792530ef1dc3a0e8b7e1e5344f3aecef462f6262c268674a34b9a1";
};
propagatedBuildInputs = [
robotframework-seleniumlibrary
];
});
dataflake-fakeldap = pythonPackages.buildPythonPackage rec {
pname = "dataflake.fakeldap";
version = "1.0";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "521e1f302f2cebd8da39e06b429ec9630cc40622d06ff095606adb06091c85d2";
};
buildInputs = [
pythonPackages.setuptools-git
];
propagatedBuildInputs = [
pythonPackages.ldap
];
};
buildout = pythonPackages.zc_buildout_nix.overrideDerivation (old: rec {
postInstall = "";
propagatedBuildInputs = [
robotframework-selenium2library
dataflake-fakeldap
pythonPackages.cryptography
pythonPackages.pillow
pythonPackages.ldap
pythonPackages.lxml
pythonPackages.kerberos
pythonPackages.python_magic
pythonPackages.watchdog
];
});
};
in stdenv.mkDerivation rec {
name = "env";
env = buildEnv { name = name; paths = buildInputs; };
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup; ln -s $env $out
'';
buildInputs = with self; [
# firefox
phantomjs2
buildout
(pythonFull.buildEnv.override {
extraLibs = buildout.propagatedNativeBuildInputs;
})
];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment