diff --git a/Pipfile b/Pipfile index fa97c512b..5d3ecb750 100644 --- a/Pipfile +++ b/Pipfile @@ -8,10 +8,10 @@ codeforlife-portal = {path = ".", editable = true} cfl-common = {path = "./cfl_common", editable = true} [dev-packages] -django-selenium-clean = "==0.3.3" +django-selenium-clean = "==1.0.0" django-test-migrations = "==1.2.0" responses = "==0.18.0" -selenium = "==3.141.0" +selenium = "==4.9.0" snapshottest = "==0.6.0" pytest-django = "==4.5.2" pytest = "==7.*" diff --git a/Pipfile.lock b/Pipfile.lock index 51af28a9c..ba9684d9c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "24bd7ab7b9f5645f6f5c263522071443114990dbd3e3268f8ef6c8fb7b2f2994" + "sha256": "b32e10e75dcbe40b70f7f4bbb3d24994c11d9064f36389ecc3a09912deeeb7a2" }, "pipfile-spec": 6, "requires": { @@ -61,84 +61,99 @@ }, "charset-normalizer": { "hashes": [ - "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", - "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", - "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", - "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", - "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", - "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", - "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", - "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", - "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", - "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", - "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", - "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", - "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", - "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", - "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", - "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", - "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", - "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", - "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", - "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", - "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", - "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", - "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", - "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", - "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", - "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", - "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", - "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", - "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", - "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", - "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", - "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", - "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", - "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", - "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", - "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", - "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", - "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", - "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", - "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", - "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", - "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", - "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", - "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", - "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", - "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", - "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", - "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", - "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", - "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", - "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", - "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", - "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", - "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", - "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", - "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", - "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", - "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", - "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", - "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", - "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", - "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", - "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", - "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", - "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", - "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", - "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", - "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", - "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", - "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", - "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", - "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", - "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", - "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", - "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843", + "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786", + "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e", + "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8", + "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4", + "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa", + "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d", + "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82", + "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7", + "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895", + "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d", + "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a", + "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382", + "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678", + "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b", + "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e", + "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741", + "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4", + "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596", + "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9", + "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69", + "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c", + "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77", + "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13", + "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459", + "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e", + "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7", + "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908", + "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a", + "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f", + "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8", + "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482", + "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d", + "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d", + "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545", + "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34", + "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86", + "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6", + "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe", + "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e", + "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc", + "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7", + "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd", + "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c", + "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557", + "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a", + "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89", + "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078", + "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e", + "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4", + "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403", + "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0", + "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89", + "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115", + "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9", + "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05", + "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a", + "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec", + "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56", + "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38", + "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479", + "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c", + "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e", + "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd", + "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186", + "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455", + "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c", + "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65", + "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78", + "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287", + "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df", + "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43", + "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1", + "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7", + "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989", + "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a", + "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63", + "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884", + "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649", + "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810", + "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828", + "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4", + "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2", + "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd", + "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5", + "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe", + "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293", + "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e", + "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e", + "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.2.0" + "version": "==3.3.0" }, "codeforlife-portal": { "editable": true, @@ -198,11 +213,11 @@ }, "django-import-export": { "hashes": [ - "sha256:1d3f2cb2ee3cca0386ed60651fa1623be989f130d9fbdf98a67f7dc3a94b8a37", - "sha256:38fd7b9439b9e3aa1a4747421c1087a5bc194e915a28d795fb8429a5f8028f2d" + "sha256:88ecaf06be06bd95d97cf34f3c911c56c012a7a81712a8956740e5bfc2465162", + "sha256:d02e31908c965d512cc6f7ef6e72935177647b15d3846050d0f094177fca0d86" ], - "markers": "python_version >= '3.7'", - "version": "==3.2.0" + "markers": "python_version >= '3.8'", + "version": "==3.3.1" }, "django-js-reverse": { "hashes": [ @@ -306,81 +321,79 @@ }, "google-auth": { "hashes": [ - "sha256:2cec41407bd1e207f5b802638e32bb837df968bb5c05f413d0fa526fac4cf7a7", - "sha256:753a26312e6f1eaeec20bc6f2644a10926697da93446e1f8e24d6d32d45a922a" + "sha256:6864247895eea5d13b9c57c9e03abb49cb94ce2dc7c58e91cba3248c7477c9e3", + "sha256:a8f4608e65c244ead9e0538f181a96c6e11199ec114d41f1d7b1bffa96937bda" ], "markers": "python_version >= '3.7'", - "version": "==2.23.0" + "version": "==2.23.3" }, "greenlet": { "hashes": [ - "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a", - "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a", - "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1", - "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43", - "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33", - "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8", - "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088", - "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca", - "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343", - "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645", - "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db", - "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df", - "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3", - "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86", - "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2", - "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a", - "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf", - "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7", - "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394", - "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40", - "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3", - "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6", - "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74", - "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0", - "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3", - "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91", - "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5", - "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9", - "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417", - "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8", - "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b", - "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6", - "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb", - "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73", - "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b", - "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df", - "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9", - "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f", - "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0", - "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857", - "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a", - "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249", - "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30", - "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292", - "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b", - "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d", - "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b", - "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c", - "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca", - "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7", - "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75", - "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae", - "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47", - "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b", - "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470", - "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c", - "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564", - "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9", - "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099", - "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0", - "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5", - "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19", - "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1", - "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526" + "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a", + "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c", + "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9", + "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d", + "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14", + "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383", + "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b", + "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99", + "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7", + "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17", + "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314", + "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66", + "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed", + "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c", + "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f", + "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464", + "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b", + "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c", + "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4", + "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362", + "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692", + "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365", + "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9", + "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e", + "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb", + "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06", + "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695", + "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f", + "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04", + "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f", + "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b", + "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7", + "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9", + "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce", + "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c", + "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35", + "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b", + "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4", + "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51", + "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a", + "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355", + "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7", + "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625", + "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99", + "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779", + "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd", + "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0", + "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705", + "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c", + "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f", + "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c", + "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870", + "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353", + "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2", + "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423", + "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a", + "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6", + "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1", + "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947", + "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810", + "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f", + "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==2.0.2" + "markers": "python_version >= '3.7'", + "version": "==3.0.0" }, "hypothesis": { "hashes": [ @@ -543,65 +556,63 @@ }, "pillow": { "hashes": [ - "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5", - "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530", - "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d", - "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca", - "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891", - "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992", - "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7", - "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3", - "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba", - "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3", - "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3", - "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f", - "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538", - "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3", - "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d", - "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c", - "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017", - "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3", - "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223", - "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e", - "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3", - "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6", - "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640", - "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334", - "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1", - "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba", - "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa", - "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0", - "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396", - "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d", - "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485", - "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf", - "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43", - "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37", - "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2", - "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd", - "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86", - "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967", - "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629", - "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568", - "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed", - "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f", - "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551", - "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3", - "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614", - "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff", - "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d", - "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883", - "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684", - "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0", - "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de", - "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b", - "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3", - "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199", - "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51", - "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90" + "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff", + "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f", + "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21", + "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635", + "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a", + "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f", + "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1", + "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d", + "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db", + "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849", + "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7", + "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876", + "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3", + "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317", + "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91", + "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d", + "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b", + "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd", + "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed", + "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500", + "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7", + "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a", + "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a", + "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0", + "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf", + "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f", + "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1", + "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088", + "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971", + "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a", + "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205", + "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54", + "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08", + "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21", + "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d", + "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08", + "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e", + "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf", + "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b", + "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145", + "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2", + "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d", + "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d", + "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf", + "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad", + "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d", + "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1", + "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4", + "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2", + "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19", + "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37", + "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4", + "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68", + "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1" ], "markers": "python_version >= '3.8'", - "version": "==10.0.0" + "version": "==10.0.1" }, "pyasn1": { "hashes": [ @@ -830,11 +841,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", + "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" ], - "markers": "python_version >= '3.7'", - "version": "==4.7.1" + "markers": "python_version >= '3.8'", + "version": "==4.8.0" }, "tzdata": { "hashes": [ @@ -846,19 +857,19 @@ }, "urllib3": { "hashes": [ - "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", - "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" + "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2", + "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.16" + "markers": "python_version >= '3.7'", + "version": "==2.0.6" }, "websocket-client": { "hashes": [ - "sha256:3aad25d31284266bcfcfd1fd8a743f63282305a364b8d0948a43bd606acc652f", - "sha256:6cfc30d051ebabb73a5fa246efdcc14c8fbebbd0330f8984ac3bb6d9edd2ad03" + "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24", + "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df" ], "markers": "python_version >= '3.8'", - "version": "==1.6.3" + "version": "==1.6.4" }, "xlrd": { "hashes": [ @@ -876,11 +887,11 @@ }, "zipp": { "hashes": [ - "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", - "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147" + "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" ], "markers": "python_version >= '3.8'", - "version": "==3.16.2" + "version": "==3.17.0" } }, "develop": { @@ -892,6 +903,14 @@ "markers": "python_version >= '3.7'", "version": "==3.7.2" }, + "attrs": { + "hashes": [ + "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", + "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1.0" + }, "black": { "hashes": [ "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f", @@ -930,84 +949,99 @@ }, "charset-normalizer": { "hashes": [ - "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", - "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", - "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", - "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", - "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", - "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", - "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", - "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", - "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", - "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", - "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", - "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", - "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", - "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", - "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", - "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", - "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", - "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", - "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", - "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", - "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", - "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", - "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", - "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", - "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", - "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", - "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", - "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", - "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", - "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", - "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", - "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", - "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", - "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", - "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", - "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", - "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", - "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", - "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", - "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", - "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", - "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", - "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", - "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", - "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", - "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", - "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", - "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", - "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", - "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", - "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", - "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", - "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", - "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", - "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", - "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", - "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", - "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", - "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", - "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", - "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", - "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", - "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", - "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", - "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", - "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", - "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", - "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", - "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", - "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", - "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", - "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", - "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", - "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", - "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843", + "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786", + "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e", + "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8", + "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4", + "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa", + "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d", + "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82", + "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7", + "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895", + "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d", + "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a", + "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382", + "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678", + "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b", + "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e", + "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741", + "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4", + "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596", + "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9", + "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69", + "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c", + "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77", + "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13", + "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459", + "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e", + "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7", + "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908", + "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a", + "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f", + "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8", + "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482", + "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d", + "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d", + "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545", + "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34", + "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86", + "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6", + "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe", + "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e", + "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc", + "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7", + "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd", + "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c", + "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557", + "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a", + "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89", + "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078", + "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e", + "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4", + "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403", + "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0", + "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89", + "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115", + "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9", + "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05", + "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a", + "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec", + "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56", + "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38", + "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479", + "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c", + "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e", + "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd", + "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186", + "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455", + "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c", + "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65", + "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78", + "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287", + "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df", + "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43", + "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1", + "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7", + "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989", + "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a", + "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63", + "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884", + "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649", + "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810", + "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828", + "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4", + "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2", + "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd", + "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5", + "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe", + "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293", + "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e", + "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e", + "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.2.0" + "version": "==3.3.0" }, "click": { "hashes": [ @@ -1022,61 +1056,61 @@ "toml" ], "hashes": [ - "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375", - "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344", - "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e", - "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745", - "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f", - "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194", - "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a", - "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f", - "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760", - "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8", - "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392", - "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d", - "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc", - "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40", - "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981", - "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0", - "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92", - "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3", - "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0", - "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086", - "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7", - "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465", - "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140", - "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952", - "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3", - "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8", - "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f", - "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593", - "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0", - "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204", - "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037", - "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276", - "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9", - "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26", - "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce", - "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7", - "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136", - "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a", - "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4", - "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c", - "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f", - "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832", - "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3", - "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969", - "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520", - "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887", - "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3", - "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6", - "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1", - "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff", - "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981", - "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e" + "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1", + "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63", + "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9", + "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312", + "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3", + "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb", + "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25", + "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92", + "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda", + "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148", + "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6", + "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216", + "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a", + "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640", + "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836", + "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c", + "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f", + "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2", + "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901", + "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed", + "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a", + "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074", + "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc", + "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84", + "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083", + "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f", + "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c", + "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c", + "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637", + "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2", + "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82", + "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f", + "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce", + "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef", + "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f", + "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611", + "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c", + "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76", + "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9", + "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce", + "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9", + "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf", + "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf", + "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9", + "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6", + "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2", + "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a", + "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a", + "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf", + "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738", + "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a", + "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4" ], "markers": "python_version >= '3.8'", - "version": "==7.3.1" + "version": "==7.3.2" }, "defusedxml": { "hashes": [ @@ -1104,19 +1138,19 @@ }, "django-import-export": { "hashes": [ - "sha256:1d3f2cb2ee3cca0386ed60651fa1623be989f130d9fbdf98a67f7dc3a94b8a37", - "sha256:38fd7b9439b9e3aa1a4747421c1087a5bc194e915a28d795fb8429a5f8028f2d" + "sha256:88ecaf06be06bd95d97cf34f3c911c56c012a7a81712a8956740e5bfc2465162", + "sha256:d02e31908c965d512cc6f7ef6e72935177647b15d3846050d0f094177fca0d86" ], - "markers": "python_version >= '3.7'", - "version": "==3.2.0" + "markers": "python_version >= '3.8'", + "version": "==3.3.1" }, "django-selenium-clean": { "hashes": [ - "sha256:19c2ef55558e7d57dd7fda690f0e6830b461098c564d736f93be37dcbfb42560", - "sha256:98c20ee83c4554397ff3ef226bebd0d8962891303162b9f874687490474d88e9" + "sha256:35982f7af664f578b6db48053ade5e4260f96c13d778308b992007a548d1fc26", + "sha256:a31b71a92934399597c1fa84401892987524d95168f48ea4212812f6f05d1eaa" ], "index": "pypi", - "version": "==0.3.3" + "version": "==1.0.0" }, "django-test-migrations": { "hashes": [ @@ -1157,6 +1191,14 @@ ], "version": "==0.3.0" }, + "h11": { + "hashes": [ + "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", + "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + ], + "markers": "python_version >= '3.7'", + "version": "==0.14.0" + }, "idna": { "hashes": [ "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", @@ -1201,13 +1243,21 @@ ], "version": "==3.1.2" }, + "outcome": { + "hashes": [ + "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672", + "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5" + ], + "markers": "python_version >= '3.7'", + "version": "==1.2.0" + }, "packaging": { "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.1" + "version": "==23.2" }, "pathspec": { "hashes": [ @@ -1219,11 +1269,11 @@ }, "platformdirs": { "hashes": [ - "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", - "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" + "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3", + "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e" ], "markers": "python_version >= '3.7'", - "version": "==3.10.0" + "version": "==3.11.0" }, "pluggy": { "hashes": [ @@ -1241,6 +1291,14 @@ "index": "pypi", "version": "==2.10.6" }, + "pysocks": { + "hashes": [ + "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", + "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", + "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" + ], + "version": "==1.7.1" + }, "pytest": { "hashes": [ "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002", @@ -1357,11 +1415,11 @@ }, "selenium": { "hashes": [ - "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c", - "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d" + "sha256:478fae77cdfaec32adb1e68d59632c8c191f920535282abcaa2d1a3d98655624", + "sha256:4c19e6aac202719373108d53a5a8e9336ba8d2b25822ca32ae6ff37acbabbdbe" ], "index": "pypi", - "version": "==3.141.0" + "version": "==4.9.0" }, "six": { "hashes": [ @@ -1379,6 +1437,21 @@ "index": "pypi", "version": "==0.6.0" }, + "sniffio": { + "hashes": [ + "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", + "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.0" + }, + "sortedcontainers": { + "hashes": [ + "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", + "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" + ], + "version": "==2.4.0" + }, "sqlparse": { "hashes": [ "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3", @@ -1418,21 +1491,37 @@ "markers": "python_version < '3.11'", "version": "==2.0.1" }, - "typing-extensions": { + "trio": { "hashes": [ - "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + "sha256:3887cf18c8bcc894433420305468388dac76932e9668afa1c49aa3806b6accb3", + "sha256:f43da357620e5872b3d940a2e3589aa251fd3f881b65a608d742e00809b1ec38" ], "markers": "python_version >= '3.7'", - "version": "==4.7.1" + "version": "==0.22.2" + }, + "trio-websocket": { + "hashes": [ + "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f", + "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638" + ], + "markers": "python_version >= '3.7'", + "version": "==0.11.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", + "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + ], + "markers": "python_version >= '3.8'", + "version": "==4.8.0" }, "urllib3": { "hashes": [ - "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", - "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" + "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2", + "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.16" + "markers": "python_version >= '3.7'", + "version": "==2.0.6" }, "wasmer": { "hashes": [ @@ -1472,6 +1561,14 @@ ], "version": "==1.1.0" }, + "wsproto": { + "hashes": [ + "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", + "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==1.2.0" + }, "xlrd": { "hashes": [ "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd", @@ -1487,4 +1584,4 @@ "version": "==1.3.0" } } -} \ No newline at end of file +} diff --git a/portal/tests/pageObjects/portal/base_page.py b/portal/tests/pageObjects/portal/base_page.py index 508d615be..a41c7ad72 100644 --- a/portal/tests/pageObjects/portal/base_page.py +++ b/portal/tests/pageObjects/portal/base_page.py @@ -1,13 +1,13 @@ from __future__ import absolute_import -from builtins import object import time +from builtins import object from selenium.common.exceptions import TimeoutException +from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.common.action_chains import ActionChains FADE_TIME = 0.5 @@ -74,27 +74,27 @@ def on_correct_page(self, pageName): return self.element_exists_by_id(pageName) def hover_over_resources_dropdown(self): - resources_dropdown = self.browser.find_element_by_id("teaching_resources_button") + resources_dropdown = self.browser.find_element(By.ID, "teaching_resources_button") hover = ActionChains(self.browser).move_to_element(resources_dropdown) hover.perform() def go_to_rapid_router_resources_page(self): self.hover_over_resources_dropdown() - self.browser.find_element_by_id("rapid_router_resources_button").click() + self.browser.find_element(By.ID, "rapid_router_resources_button").click() from .resources_page import ResourcesPage return ResourcesPage(self.browser) def go_to_kurono_resources_page(self): self.hover_over_resources_dropdown() - self.browser.find_element_by_id("kurono_resources_button").click() + self.browser.find_element(By.ID, "kurono_resources_button").click() from .resources_page import ResourcesPage return ResourcesPage(self.browser) def go_to_kurono_teacher_dashboard_page(self): - self.browser.find_element_by_id("games_button").click() - self.browser.find_element_by_id("teacher_kurono_dashboard_button").click() + self.browser.find_element(By.ID, "games_button").click() + self.browser.find_element(By.ID, "teacher_kurono_dashboard_button").click() from .kurono_teacher_dashboard_page import KuronoTeacherDashboardPage return KuronoTeacherDashboardPage(self.browser) @@ -112,19 +112,19 @@ def is_on_403_forbidden(self): return self.on_correct_page("403_forbidden") def was_form_invalid(self, formID, error): - errors = self.browser.find_element_by_id(formID).find_element_by_class_name("errorlist").text + errors = self.browser.find_element(By.ID, formID).find_element(By.CLASS_NAME, "errorlist").text return error in errors def is_dialog_showing(self): time.sleep(FADE_TIME) - return self.browser.find_element_by_id("popup").is_displayed() + return self.browser.find_element(By.ID, "popup").is_displayed() def confirm_dialog(self): - self.browser.find_element_by_id("confirm_button").click() + self.browser.find_element(By.ID, "confirm_button").click() time.sleep(FADE_TIME) return self def cancel_dialog(self): - self.browser.find_element_by_id("cancel_button").click() + self.browser.find_element(By.ID, "cancel_button").click() time.sleep(FADE_TIME) return self diff --git a/portal/tests/pageObjects/portal/email_verification_needed_page.py b/portal/tests/pageObjects/portal/email_verification_needed_page.py index 90b03ff30..7f1a5c868 100644 --- a/portal/tests/pageObjects/portal/email_verification_needed_page.py +++ b/portal/tests/pageObjects/portal/email_verification_needed_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from . import home_page from .base_page import BasePage @@ -10,5 +12,5 @@ def __init__(self, browser): assert self.on_correct_page("emailVerificationNeeded_page") def return_to_home_page(self): - self.browser.find_element_by_id("home_button").click() + self.browser.find_element(By.ID, "home_button").click() return home_page.HomePage(self.browser) diff --git a/portal/tests/pageObjects/portal/game_page.py b/portal/tests/pageObjects/portal/game_page.py index 46e84e027..8028db181 100644 --- a/portal/tests/pageObjects/portal/game_page.py +++ b/portal/tests/pageObjects/portal/game_page.py @@ -25,20 +25,20 @@ def _dismiss_initial_dialog(self): def dismiss_dialog(self, button_id): self.wait_for_element_to_be_clickable((By.ID, button_id)) - self.browser.find_element_by_id(button_id).click() + self.browser.find_element(By.ID, button_id).click() self.wait_for_element_to_be_invisible((By.ID, button_id)) def load_solution(self, workspace_id): - self.browser.find_element_by_id("load_tab").click() + self.browser.find_element(By.ID, "load_tab").click() selector = "#loadWorkspaceTable tr[value='" + str(workspace_id) + "']" self.wait_for_element_to_be_clickable((By.CSS_SELECTOR, selector)) - self.browser.find_element_by_css_selector(selector).click() - self.browser.find_element_by_id("loadWorkspace").click() + self.browser.find_element(By.CSS_SELECTOR, selector).click() + self.browser.find_element(By.ID, "loadWorkspace").click() time.sleep(1) return self def clear(self): - self.browser.find_element_by_id("clear_tab").click() + self.browser.find_element(By.ID, "clear_tab").click() return self def try_again(self): @@ -46,7 +46,7 @@ def try_again(self): return self def step(self): - self.browser.find_element_by_id("step_tab").click() + self.browser.find_element(By.ID, "step_tab").click() return self def assert_is_green_light(self, traffic_light_index): @@ -56,12 +56,12 @@ def assert_is_red_light(self, traffic_light_index): self._assert_light_is_on(traffic_light_index, "red") def _assert_light_is_on(self, traffic_light_index, colour): - image = self.browser.find_element_by_id("trafficLight_%s_%s" % (traffic_light_index, colour)) + image = self.browser.find_element(By.ID, "trafficLight_%s_%s" % (traffic_light_index, colour)) assert_that(image.get_attribute("opacity"), equal_to("1")) def run_program(self, wait_for_element_id="algorithmScore"): - self.browser.find_element_by_id("fast_tab").click() + self.browser.find_element(By.ID, "fast_tab").click() try: self.wait_for_element_to_be_clickable((By.ID, wait_for_element_id), 45) @@ -84,12 +84,12 @@ def run_program_that_runs_out_of_instructions(self): def _run_failing_program(self, text): self.run_program("try_again_button") - error_message = self.browser.find_element_by_id("myModal-lead").text + error_message = self.browser.find_element(By.ID, "myModal-lead").text assert_that(error_message, contains_string(text)) return self def _assert_score(self, element_id, score): - route_score = self.browser.find_element_by_id(element_id).text + route_score = self.browser.find_element(By.ID, element_id).text assert_that(route_score, equal_to(score)) return self diff --git a/portal/tests/pageObjects/portal/home_page.py b/portal/tests/pageObjects/portal/home_page.py index 978702878..398851c7d 100644 --- a/portal/tests/pageObjects/portal/home_page.py +++ b/portal/tests/pageObjects/portal/home_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from .base_page import BasePage @@ -9,36 +11,36 @@ def __init__(self, browser): assert self.on_correct_page("home_page") def go_to_teacher_login_page(self): - self.browser.find_element_by_id("login_dropdown").click() - self.browser.find_element_by_id("teacher_login_button").click() + self.browser.find_element(By.ID, "login_dropdown").click() + self.browser.find_element(By.ID, "teacher_login_button").click() from portal.tests.pageObjects.portal.teacher_login_page import TeacherLoginPage return TeacherLoginPage(self.browser) def teacher_logout(self): - self.browser.find_element_by_id("logout_menu").click() - self.browser.find_element_by_id("logout_button").click() + self.browser.find_element(By.ID, "logout_menu").click() + self.browser.find_element(By.ID, "logout_button").click() return HomePage(self.browser) def go_to_independent_student_login_page(self): - self.browser.find_element_by_id("login_dropdown").click() - self.browser.find_element_by_id("independent_login_button").click() + self.browser.find_element(By.ID, "login_dropdown").click() + self.browser.find_element(By.ID, "independent_login_button").click() from portal.tests.pageObjects.portal.independent_login_page import IndependentStudentLoginPage return IndependentStudentLoginPage(self.browser) def go_to_student_login_page(self): - self.browser.find_element_by_id("login_dropdown").click() - self.browser.find_element_by_id("student_login_button").click() + self.browser.find_element(By.ID, "login_dropdown").click() + self.browser.find_element(By.ID, "student_login_button").click() from portal.tests.pageObjects.portal.student_login_class_code import StudentLoginClassCodePage return StudentLoginClassCodePage(self.browser) def go_to_signup_page(self): - self.browser.find_element_by_id("signup_button").click() + self.browser.find_element(By.ID, "signup_button").click() import portal.tests.pageObjects.portal.signup_page as signup_page diff --git a/portal/tests/pageObjects/portal/independent_login_page.py b/portal/tests/pageObjects/portal/independent_login_page.py index 8fd16b2a3..a16605795 100644 --- a/portal/tests/pageObjects/portal/independent_login_page.py +++ b/portal/tests/pageObjects/portal/independent_login_page.py @@ -1,3 +1,5 @@ +from selenium.webdriver.common.by import By + from .base_page import BasePage from .password_reset_page import PasswordResetPage from .play import dashboard_page @@ -19,14 +21,14 @@ def independent_student_login_failure(self, email, password): return self def _independent_student_login(self, email, password): - self.browser.find_element_by_id("id_username").send_keys(email) - self.browser.find_element_by_id("id_password").send_keys(password) - self.browser.find_element_by_name("independent_student_login").click() + self.browser.find_element(By.ID, "id_username").send_keys(email) + self.browser.find_element(By.ID, "id_password").send_keys(password) + self.browser.find_element(By.NAME, "independent_student_login").click() def go_to_indep_forgotten_password_page(self): - self.browser.find_element_by_id("student_forgotten_password_button").click() + self.browser.find_element(By.ID, "student_forgotten_password_button").click() return PasswordResetPage(self.browser) def has_login_failed(self, form_id, error): - errors = self.browser.find_element_by_id(form_id).find_element_by_class_name("errorlist").text + errors = self.browser.find_element(By.ID, form_id).find_element(By.CLASS_NAME, "errorlist").text return error in errors diff --git a/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py b/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py index 641bc9515..37e831cb7 100644 --- a/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py +++ b/portal/tests/pageObjects/portal/kurono_teacher_dashboard_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from .base_page import BasePage @@ -12,14 +14,14 @@ def __init__(self, browser): def create_game(self, class_id): self._click_add_game_dropdown() - self.browser.find_element_by_id(f"class_{class_id}").click() + self.browser.find_element(By.ID, f"class_{class_id}").click() return self def change_game_worksheet(self, worksheet_id): self._click_change_worksheet_dropdown() - self.browser.find_element_by_id(f"worksheet_{worksheet_id}").click() + self.browser.find_element(By.ID, f"worksheet_{worksheet_id}").click() self.confirm_dialog() @@ -28,20 +30,20 @@ def change_game_worksheet(self, worksheet_id): def delete_games(self, game_ids): # Tick checkboxes for game_id in game_ids: - self.browser.find_element_by_xpath(f"//input[@name='game_ids' and @value='{game_id}']").click() + self.browser.find_element(By.XPATH, f"//input[@name='game_ids' and @value='{game_id}']").click() # Click delete - self.browser.find_element_by_id("deleteGamesButton").click() + self.browser.find_element(By.ID, "deleteGamesButton").click() self.confirm_dialog() return self def _click_change_worksheet_confirm_button(self): - self.browser.find_element_by_id("confirm_button").click() + self.browser.find_element(By.ID, "confirm_button").click() def _click_add_game_dropdown(self): - self.browser.find_element_by_id("add_class_dropdown").click() + self.browser.find_element(By.ID, "add_class_dropdown").click() def _click_change_worksheet_dropdown(self): - self.browser.find_element_by_id("worksheets_dropdown").click() + self.browser.find_element(By.ID, "worksheets_dropdown").click() diff --git a/portal/tests/pageObjects/portal/password_reset_form_page.py b/portal/tests/pageObjects/portal/password_reset_form_page.py index 0178abbe3..beec01e29 100644 --- a/portal/tests/pageObjects/portal/password_reset_form_page.py +++ b/portal/tests/pageObjects/portal/password_reset_form_page.py @@ -1,8 +1,9 @@ from __future__ import absolute_import -from .base_page import BasePage - from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By + +from .base_page import BasePage class PasswordResetPage(BasePage): @@ -15,7 +16,7 @@ def teacher_reset_password(self, new_password): self.clear_and_fill("new_password1", new_password) self.clear_and_fill("new_password2", new_password) - self.browser.find_element_by_id("teacher_update_button").click() + self.browser.find_element(By.ID, "teacher_update_button").click() self.wait_for_element_by_id("reset_password_done_page") @@ -25,7 +26,7 @@ def student_reset_password(self, new_password): self.clear_and_fill("new_password1", new_password) self.clear_and_fill("new_password2", new_password) - self.browser.find_element_by_id("student_update_button").click() + self.browser.find_element(By.ID, "student_update_button").click() self.wait_for_element_by_id("reset_password_done_page") @@ -36,14 +37,14 @@ def reset_password_fail(self, new_password): self.clear_and_fill("new_password2", new_password) try: - update_button = self.browser.find_element_by_id("teacher_update_button") + update_button = self.browser.find_element(By.ID, "teacher_update_button") except NoSuchElementException: - update_button = self.browser.find_element_by_id("student_update_button") + update_button = self.browser.find_element(By.ID, "student_update_button") update_button.click() return self def clear_and_fill(self, field, value): - self.browser.find_element_by_id("id_" + field).clear() - self.browser.find_element_by_id("id_" + field).send_keys(value) + self.browser.find_element(By.ID, "id_" + field).clear() + self.browser.find_element(By.ID, "id_" + field).send_keys(value) diff --git a/portal/tests/pageObjects/portal/password_reset_page.py b/portal/tests/pageObjects/portal/password_reset_page.py index 1de99c162..d734132c8 100644 --- a/portal/tests/pageObjects/portal/password_reset_page.py +++ b/portal/tests/pageObjects/portal/password_reset_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from .base_page import BasePage from .home_page import HomePage @@ -11,13 +13,13 @@ def __init__(self, browser): assert self.on_correct_page("reset_password_page") def cancel(self): - self.browser.find_element_by_id("cancel_button").click() + self.browser.find_element(By.ID, "cancel_button").click() return HomePage(self.browser) def reset_email_submit(self, email): - self.browser.find_element_by_id("id_email").send_keys(email) + self.browser.find_element(By.ID, "id_email").send_keys(email) self.wait_for_element_by_id("reset_button") - self.browser.find_element_by_id("reset_button").click() + self.browser.find_element(By.ID, "reset_button").click() return self diff --git a/portal/tests/pageObjects/portal/play/account_page.py b/portal/tests/pageObjects/portal/play/account_page.py index c8747a1e6..8baef5a5b 100644 --- a/portal/tests/pageObjects/portal/play/account_page.py +++ b/portal/tests/pageObjects/portal/play/account_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from portal.tests.pageObjects.portal.email_verification_needed_page import EmailVerificationNeededPage from portal.tests.pageObjects.portal.independent_login_page import IndependentStudentLoginPage from portal.tests.pageObjects.portal.play.dashboard_page import PlayDashboardPage @@ -17,18 +19,18 @@ def check_account_details(self, details): correct = True for field, value in list(details.items()): - correct &= self.browser.find_element_by_id("id_" + field).get_attribute("value") == value + correct &= self.browser.find_element(By.ID, "id_" + field).get_attribute("value") == value return correct def _change_details(self, details): for field, value in list(details.items()): - self.browser.find_element_by_id("id_" + field).clear() - self.browser.find_element_by_id("id_" + field).send_keys(value) - self.browser.find_element_by_id("update_button").click() + self.browser.find_element(By.ID, "id_" + field).clear() + self.browser.find_element(By.ID, "id_" + field).send_keys(value) + self.browser.find_element(By.ID, "update_button").click() def submit_empty_form(self): - self.browser.find_element_by_id("update_button").click() + self.browser.find_element(By.ID, "update_button").click() return self def update_password_failure(self, new_password, confirm_new_password, old_password): @@ -55,13 +57,13 @@ def change_email(self, new_email, password): return EmailVerificationNeededPage(self.browser) def _update_password(self, new_password, confirm_new_password, old_password): - self.browser.find_element_by_id("id_password").send_keys(new_password) - self.browser.find_element_by_id("id_confirm_password").send_keys(confirm_new_password) - self.browser.find_element_by_id("id_current_password").send_keys(old_password) - self.browser.find_element_by_id("update_button").click() + self.browser.find_element(By.ID, "id_password").send_keys(new_password) + self.browser.find_element(By.ID, "id_confirm_password").send_keys(confirm_new_password) + self.browser.find_element(By.ID, "id_current_password").send_keys(old_password) + self.browser.find_element(By.ID, "update_button").click() def _update_name(self, new_name, password): - self.browser.find_element_by_id("id_name").clear() - self.browser.find_element_by_id("id_name").send_keys(new_name) - self.browser.find_element_by_id("id_current_password").send_keys(password) - self.browser.find_element_by_id("update_button").click() + self.browser.find_element(By.ID, "id_name").clear() + self.browser.find_element(By.ID, "id_name").send_keys(new_name) + self.browser.find_element(By.ID, "id_current_password").send_keys(password) + self.browser.find_element(By.ID, "update_button").click() diff --git a/portal/tests/pageObjects/portal/play/dashboard_page.py b/portal/tests/pageObjects/portal/play/dashboard_page.py index 4301fe91d..6afb3aa73 100644 --- a/portal/tests/pageObjects/portal/play/dashboard_page.py +++ b/portal/tests/pageObjects/portal/play/dashboard_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from portal.tests.pageObjects.portal.play.join_school_or_club_page import JoinSchoolOrClubPage from .play_base_page import PlayBasePage @@ -11,6 +13,6 @@ def __init__(self, browser): assert self.on_correct_page("play_dashboard_page") def go_to_join_a_school_or_club_page(self): - self.browser.find_element_by_id("student_join_school_link").click() + self.browser.find_element(By.ID, "student_join_school_link").click() return JoinSchoolOrClubPage(self.browser) diff --git a/portal/tests/pageObjects/portal/play/join_school_or_club_page.py b/portal/tests/pageObjects/portal/play/join_school_or_club_page.py index 9157f1981..367f60349 100644 --- a/portal/tests/pageObjects/portal/play/join_school_or_club_page.py +++ b/portal/tests/pageObjects/portal/play/join_school_or_club_page.py @@ -1,3 +1,5 @@ +from selenium.webdriver.common.by import By + from portal.tests.pageObjects.portal.play.play_base_page import PlayBasePage @@ -8,24 +10,24 @@ def __init__(self, browser): assert self.on_correct_page("play_join_organisation_page") def join_a_school_or_club(self, access_code): - self.browser.find_element_by_id("id_access_code").send_keys(access_code) - self.browser.find_element_by_id("request_join_a_school_or_club_button").click() + self.browser.find_element(By.ID, "id_access_code").send_keys(access_code) + self.browser.find_element(By.ID, "request_join_a_school_or_club_button").click() assert self.element_exists_by_css(".success") return self def join_a_school_or_club_failure(self, access_code): - self.browser.find_element_by_id("id_access_code").send_keys(access_code) - self.browser.find_element_by_id("request_join_a_school_or_club_button").click() + self.browser.find_element(By.ID, "id_access_code").send_keys(access_code) + self.browser.find_element(By.ID, "request_join_a_school_or_club_button").click() assert not self.element_exists_by_css(".success") return self def has_join_request_failed(self, error): - errors = self.browser.find_element_by_id("join_class_form").find_element_by_class_name("errorlist").text + errors = self.browser.find_element(By.ID, "join_class_form").find_element(By.CLASS_NAME, "errorlist").text return error in errors def revoke_join_request(self): - self.browser.find_element_by_name("revoke_join_request").click() + self.browser.find_element(By.NAME, "revoke_join_request").click() return self diff --git a/portal/tests/pageObjects/portal/play/play_base_page.py b/portal/tests/pageObjects/portal/play/play_base_page.py index 2ffa49c3c..cdfe07ff2 100644 --- a/portal/tests/pageObjects/portal/play/play_base_page.py +++ b/portal/tests/pageObjects/portal/play/play_base_page.py @@ -2,6 +2,8 @@ import time +from selenium.webdriver.common.by import By + from portal.tests.pageObjects.portal.base_page import BasePage @@ -11,7 +13,7 @@ def __init__(self, browser): def logout(self): self.open_user_options_box() - self.browser.find_element_by_id("logout_button").click() + self.browser.find_element(By.ID, "logout_button").click() from portal.tests.pageObjects.portal.home_page import HomePage @@ -19,12 +21,12 @@ def logout(self): def go_to_account_page(self): self.open_user_options_box() - self.browser.find_element_by_id("student_edit_account_button").click() + self.browser.find_element(By.ID, "student_edit_account_button").click() from .account_page import PlayAccountPage return PlayAccountPage(self.browser) def open_user_options_box(self): - self.browser.find_element_by_id("logout_menu").click() + self.browser.find_element(By.ID, "logout_menu").click() time.sleep(1) diff --git a/portal/tests/pageObjects/portal/signup_page.py b/portal/tests/pageObjects/portal/signup_page.py index 0b5646fad..7122974d9 100644 --- a/portal/tests/pageObjects/portal/signup_page.py +++ b/portal/tests/pageObjects/portal/signup_page.py @@ -1,5 +1,6 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from . import email_verification_needed_page @@ -22,17 +23,17 @@ def signup( success=True, newsletter=False, ): - self.browser.find_element_by_id("id_teacher_signup-teacher_first_name").send_keys(first_name) - self.browser.find_element_by_id("id_teacher_signup-teacher_last_name").send_keys(last_name) - self.browser.find_element_by_id("id_teacher_signup-teacher_email").send_keys(email) - self.browser.find_element_by_id("id_teacher_signup-teacher_password").send_keys(password) - self.browser.find_element_by_id("id_teacher_signup-teacher_confirm_password").send_keys(confirm_password) - self.browser.find_element_by_id("id_teacher_signup-consent_ticked").click() + self.browser.find_element(By.ID, "id_teacher_signup-teacher_first_name").send_keys(first_name) + self.browser.find_element(By.ID, "id_teacher_signup-teacher_last_name").send_keys(last_name) + self.browser.find_element(By.ID, "id_teacher_signup-teacher_email").send_keys(email) + self.browser.find_element(By.ID, "id_teacher_signup-teacher_password").send_keys(password) + self.browser.find_element(By.ID, "id_teacher_signup-teacher_confirm_password").send_keys(confirm_password) + self.browser.find_element(By.ID, "id_teacher_signup-consent_ticked").click() if newsletter: - self.browser.find_element_by_id("id_teacher_signup-newsletter_ticked").click() + self.browser.find_element(By.ID, "id_teacher_signup-newsletter_ticked").click() - self.browser.find_element_by_name("teacher_signup").click() + self.browser.find_element(By.NAME, "teacher_signup").click() if success: return email_verification_needed_page.EmailVerificationNeededPage(self.browser) @@ -40,22 +41,22 @@ def signup( return self def independent_student_signup(self, name, email_address, password, confirm_password, success=True): - dob_day_element = self.browser.find_element_by_id("id_independent_student_signup-date_of_birth_day") - dob_month_element = self.browser.find_element_by_id("id_independent_student_signup-date_of_birth_month") - dob_year_element = self.browser.find_element_by_id("id_independent_student_signup-date_of_birth_year") + dob_day_element = self.browser.find_element(By.ID, "id_independent_student_signup-date_of_birth_day") + dob_month_element = self.browser.find_element(By.ID, "id_independent_student_signup-date_of_birth_month") + dob_year_element = self.browser.find_element(By.ID, "id_independent_student_signup-date_of_birth_year") day_select = Select(dob_day_element) month_select = Select(dob_month_element) year_select = Select(dob_year_element) day_select.select_by_value("7") month_select.select_by_value("10") year_select.select_by_value("1997") - self.browser.find_element_by_id("id_independent_student_signup-name").send_keys(name) - self.browser.find_element_by_id("id_independent_student_signup-email").send_keys(email_address) - self.browser.find_element_by_id("id_independent_student_signup-password").send_keys(password) - self.browser.find_element_by_id("id_independent_student_signup-confirm_password").send_keys(confirm_password) - self.browser.find_element_by_id("id_independent_student_signup-consent_ticked").click() + self.browser.find_element(By.ID, "id_independent_student_signup-name").send_keys(name) + self.browser.find_element(By.ID, "id_independent_student_signup-email").send_keys(email_address) + self.browser.find_element(By.ID, "id_independent_student_signup-password").send_keys(password) + self.browser.find_element(By.ID, "id_independent_student_signup-confirm_password").send_keys(confirm_password) + self.browser.find_element(By.ID, "id_independent_student_signup-consent_ticked").click() - self.browser.find_element_by_name("independent_student_signup").click() + self.browser.find_element(By.NAME, "independent_student_signup").click() if success: from .email_verification_needed_page import EmailVerificationNeededPage diff --git a/portal/tests/pageObjects/portal/student_login_class_code.py b/portal/tests/pageObjects/portal/student_login_class_code.py index e9dd29921..594beb07c 100644 --- a/portal/tests/pageObjects/portal/student_login_class_code.py +++ b/portal/tests/pageObjects/portal/student_login_class_code.py @@ -1,6 +1,7 @@ -from .base_page import BasePage +from selenium.webdriver.common.by import By + from . import student_login_page -import time +from .base_page import BasePage class StudentLoginClassCodePage(BasePage): @@ -19,9 +20,9 @@ def student_input_access_code_failure(self, access_code): return self def _student_input_access_code(self, access_code): - self.browser.find_element_by_id("id_access_code").send_keys(access_code) - self.browser.find_element_by_name("school_login_class_code").click() + self.browser.find_element(By.ID, "id_access_code").send_keys(access_code) + self.browser.find_element(By.NAME, "school_login_class_code").click() def has_access_code_input_failed(self, form_id, error): - errors = self.browser.find_element_by_id(form_id).find_element_by_class_name("errorlist").text + errors = self.browser.find_element(By.ID, form_id).find_element(By.CLASS_NAME, "errorlist").text return error in errors diff --git a/portal/tests/pageObjects/portal/student_login_page.py b/portal/tests/pageObjects/portal/student_login_page.py index 7a19387fd..acc26e927 100644 --- a/portal/tests/pageObjects/portal/student_login_page.py +++ b/portal/tests/pageObjects/portal/student_login_page.py @@ -1,3 +1,5 @@ +from selenium.webdriver.common.by import By + from .base_page import BasePage from .play import dashboard_page @@ -18,10 +20,10 @@ def student_login_failure(self, name, password): return self def _student_login(self, name, password): - self.browser.find_element_by_id("id_username").send_keys(name) - self.browser.find_element_by_id("id_password").send_keys(password) - self.browser.find_element_by_name("school_login").click() + self.browser.find_element(By.ID, "id_username").send_keys(name) + self.browser.find_element(By.ID, "id_password").send_keys(password) + self.browser.find_element(By.NAME, "school_login").click() def has_login_failed(self, form_id, error): - errors = self.browser.find_element_by_id(form_id).find_element_by_class_name("errorlist").text + errors = self.browser.find_element(By.ID, form_id).find_element(By.CLASS_NAME, "errorlist").text return error in errors diff --git a/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py b/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py index ef40158b6..bde454a5e 100644 --- a/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py +++ b/portal/tests/pageObjects/portal/teach/add_independent_student_to_class_page.py @@ -13,12 +13,12 @@ def __init__(self, browser): assert self.on_correct_page("add_independent_student_to_class") def _rename(self, name): - self.browser.find_element_by_id("id_name").clear() - self.browser.find_element_by_id("id_name").send_keys(name) + self.browser.find_element(By.ID, "id_name").clear() + self.browser.find_element(By.ID, "id_name").send_keys(name) def save(self, name): self._rename(name) self.wait_for_element_to_be_clickable((By.ID, "save_student_name_button")) - self.browser.find_element_by_id("save_student_name_button").click() + self.browser.find_element(By.ID, "save_student_name_button").click() return AddedIndependentStudentToClassPage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py b/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py index bca4ee7b8..858bfc573 100644 --- a/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py +++ b/portal/tests/pageObjects/portal/teach/added_independent_student_to_class_page.py @@ -1,3 +1,5 @@ +from selenium.webdriver.common.by import By + from portal.tests.pageObjects.portal.teach.class_page import TeachClassPage from portal.tests.pageObjects.portal.teach.teach_base_page import TeachBasePage @@ -9,6 +11,6 @@ def __init__(self, browser): assert self.on_correct_page("added_independent_student_to_class") def return_to_class(self): - self.browser.find_element_by_id("return_button").click() + self.browser.find_element(By.ID, "return_button").click() return TeachClassPage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/class_page.py b/portal/tests/pageObjects/portal/teach/class_page.py index 9b24c6b55..f7b72f995 100644 --- a/portal/tests/pageObjects/portal/teach/class_page.py +++ b/portal/tests/pageObjects/portal/teach/class_page.py @@ -1,3 +1,5 @@ +from selenium.webdriver.common.by import By + from .teach_base_page import TeachBasePage @@ -8,7 +10,7 @@ def __init__(self, browser): assert self.on_correct_page("teach_class_page") def type_student_name(self, name): - self.browser.find_element_by_id("id_names").send_keys(name + "\n") + self.browser.find_element(By.ID, "id_names").send_keys(name + "\n") return self def create_students(self): @@ -19,14 +21,14 @@ def create_students(self): return onboarding_student_list_page.OnboardingStudentListPage(self.browser) def click_create_students(self): - self.browser.find_element_by_name("new_students").click() + self.browser.find_element(By.NAME, "new_students").click() return self def adding_students_failed(self): if not self.element_exists_by_css(".errorlist"): return False - error_list = self.browser.find_element_by_id("form-create-students").find_element_by_class_name("errorlist") + error_list = self.browser.find_element(By.ID, "form-create-students").find_element(By.CLASS_NAME, "errorlist") return error_list.text @@ -34,35 +36,35 @@ def duplicate_students(self, name): if not self.element_exists_by_css(".errorlist"): return False - errors = self.browser.find_element_by_id("form-create-students").find_element_by_class_name("errorlist").text + errors = self.browser.find_element(By.ID, "form-create-students").find_element(By.CLASS_NAME, "errorlist").text error = "You cannot add more than one student called '{0}'".format(name) return error in errors def student_exists(self, name): - return name in self.browser.find_element_by_id("student_table").text + return name in self.browser.find_element(By.ID, "student_table").text def delete_students(self): - self.browser.find_element_by_id("deleteSelectedStudents").click() + self.browser.find_element(By.ID, "deleteSelectedStudents").click() return self def reset_passwords(self): - self.browser.find_element_by_id("resetSelectedStudents").click() + self.browser.find_element(By.ID, "resetSelectedStudents").click() return self def move_students(self): - self.browser.find_element_by_id("moveSelectedStudents").click() + self.browser.find_element(By.ID, "moveSelectedStudents").click() import portal.tests.pageObjects.portal.teach.move_students_page as move_students_page return move_students_page.TeachMoveStudentsPage(self.browser) def move_students_none_selected(self): - self.browser.find_element_by_id("moveSelectedStudents").click() + self.browser.find_element(By.ID, "moveSelectedStudents").click() return self def dismiss_students(self): - self.browser.find_element_by_id("dismissSelectedStudents").click() + self.browser.find_element(By.ID, "dismissSelectedStudents").click() import portal.tests.pageObjects.portal.teach.dismiss_students_page as dismiss_students_page @@ -81,25 +83,25 @@ def confirm_reset_student_dialog(self): return onboarding_student_list_page.OnboardingStudentListPage(self.browser) def toggle_select_student(self): - self.browser.find_element_by_id("student_checkbox").click() + self.browser.find_element(By.ID, "student_checkbox").click() return self def toggle_all_students(self): - self.browser.find_element_by_id("selectedStudentsListToggle").click() + self.browser.find_element(By.ID, "selectedStudentsListToggle").click() return self def has_students(self): return self.element_exists_by_id("student_table") def go_to_edit_student_page(self): - self.browser.find_element_by_id("edit_student_button").click() + self.browser.find_element(By.ID, "edit_student_button").click() import portal.tests.pageObjects.portal.teach.edit_student_page as edit_student_page return edit_student_page.EditStudentPage(self.browser) def go_to_dashboard(self): - self.browser.find_element_by_id("return_to_classes_button").click() + self.browser.find_element(By.ID, "return_to_classes_button").click() # stop scrolling animation and scroll to top as the classes page will scroll to classes by default self.browser.execute_script("$('html,body').stop();window.scrollTo(0, 0)") diff --git a/portal/tests/pageObjects/portal/teach/dashboard_page.py b/portal/tests/pageObjects/portal/teach/dashboard_page.py index 177d425ee..4edcfda1e 100644 --- a/portal/tests/pageObjects/portal/teach/dashboard_page.py +++ b/portal/tests/pageObjects/portal/teach/dashboard_page.py @@ -1,5 +1,6 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from .add_independent_student_to_class_page import AddIndependentStudentToClassPage @@ -16,19 +17,19 @@ def __init__(self, browser): assert self.on_correct_page("teach_dashboard_page") def go_to_class_page(self): - self.browser.find_element_by_id("class_button").click() + self.browser.find_element(By.ID, "class_button").click() return TeachClassPage(self.browser) def open_school_tab(self): - self.browser.find_element_by_id("tab-school").click() + self.browser.find_element(By.ID, "tab-school").click() return self def open_classes_tab(self): - self.browser.find_element_by_id("tab-classes").click() + self.browser.find_element(By.ID, "tab-classes").click() return self def open_account_tab(self): - self.browser.find_element_by_id("tab-account").click() + self.browser.find_element(By.ID, "tab-account").click() return self def check_organisation_details(self, details): @@ -38,33 +39,33 @@ def check_organisation_details(self, details): self.wait_for_element_by_id("id_" + first_field) for field, value in list(details.items()): - correct &= self.browser.find_element_by_id("id_" + field).get_attribute("value") == value + correct &= self.browser.find_element(By.ID, "id_" + field).get_attribute("value") == value return correct def change_organisation_details(self, details): for field, value in list(details.items()): - self.browser.find_element_by_id("id_" + field).clear() - self.browser.find_element_by_id("id_" + field).send_keys(value) + self.browser.find_element(By.ID, "id_" + field).clear() + self.browser.find_element(By.ID, "id_" + field).send_keys(value) - self.browser.find_element_by_id("update_details_button").click() + self.browser.find_element(By.ID, "update_details_button").click() return self def has_edit_failed(self): self.wait_for_element_by_id("edit_form") - errorlist = self.browser.find_element_by_id("edit_form").find_element_by_class_name("errorlist").text + errorlist = self.browser.find_element(By.ID, "edit_form").find_element(By.CLASS_NAME, "errorlist").text error = "There is already a school or club registered with that name and postcode" return error in errorlist def create_class(self, name, classmate_progress, teacher_id=None): - self.browser.find_element_by_id("id_class_name").send_keys(name) + self.browser.find_element(By.ID, "id_class_name").send_keys(name) if classmate_progress: - self.browser.find_element_by_id("id_classmate_progress").click() + self.browser.find_element(By.ID, "id_classmate_progress").click() if teacher_id is not None: - Select(self.browser.find_element_by_id("id_teacher")).select_by_value(str(teacher_id)) + Select(self.browser.find_element(By.ID, "id_teacher")).select_by_value(str(teacher_id)) - self.browser.find_element_by_id("create_class_button").click() + self.browser.find_element(By.ID, "create_class_button").click() return self @@ -97,29 +98,29 @@ def change_password(self, first_name, last_name, new_password, password): def _change_details(self, details): for field, value in list(details.items()): - self.browser.find_element_by_id("id_" + field).clear() - self.browser.find_element_by_id("id_" + field).send_keys(value) - self.browser.find_element_by_id("update_button").click() + self.browser.find_element(By.ID, "id_" + field).clear() + self.browser.find_element(By.ID, "id_" + field).send_keys(value) + self.browser.find_element(By.ID, "update_button").click() def check_account_details(self, details): correct = True for field, value in list(details.items()): - correct &= self.browser.find_element_by_id("id_" + field).get_attribute("value") == value + correct &= self.browser.find_element(By.ID, "id_" + field).get_attribute("value") == value return correct def accept_independent_join_request(self): - self.browser.find_element_by_id("allow_independent_button").click() + self.browser.find_element(By.ID, "allow_independent_button").click() return AddIndependentStudentToClassPage(self.browser) def deny_independent_join_request(self): - self.browser.find_element_by_id("deny_independent_button").click() + self.browser.find_element(By.ID, "deny_independent_button").click() return self def has_independent_join_request(self, email): return self.element_exists_by_id("independent_request_table") and ( - email in self.browser.find_element_by_id("independent_request_table").text + email in self.browser.find_element(By.ID, "independent_request_table").text ) def has_no_independent_join_requests(self): @@ -127,17 +128,17 @@ def has_no_independent_join_requests(self): def has_onboarding_complete_popup(self): return self.element_exists_by_id("info-popup") and ( - self.browser.find_element_by_id("info-popup").text.startswith("Registration complete!") + self.browser.find_element(By.ID, "info-popup").text.startswith("Registration complete!") ) def is_teacher_in_school(self, name): - return name in self.browser.find_element_by_id("teachers_table").text + return name in self.browser.find_element(By.ID, "teachers_table").text def is_not_teacher_in_school(self, name): - return name not in self.browser.find_element_by_id("teachers_table").text + return name not in self.browser.find_element(By.ID, "teachers_table").text def is_teacher_admin(self): - return "Revoke admin" in self.browser.find_element_by_id("teachers_table").text + return "Revoke admin" in self.browser.find_element(By.ID, "teachers_table").text def has_classes(self): return self.element_exists_by_id("classes-table") @@ -148,25 +149,25 @@ def does_not_have_classes(self): def does_class_exist(self, name, access_code): return ( self.has_classes() - and (name in self.browser.find_element_by_id("classes-table").text) - and (access_code in self.browser.find_element_by_id("classes-table").text) + and (name in self.browser.find_element(By.ID, "classes-table").text) + and (access_code in self.browser.find_element(By.ID, "classes-table").text) ) def is_teacher_non_admin(self): - return "Make admin" in self.browser.find_element_by_id("teachers_table").text + return "Make admin" in self.browser.find_element(By.ID, "teachers_table").text def click_kick_button(self): - self.browser.find_element_by_id("kick_button").click() + self.browser.find_element(By.ID, "kick_button").click() return self def click_make_admin_button(self): - self.browser.find_element_by_id("make_admin_button").click() + self.browser.find_element(By.ID, "make_admin_button").click() return self def click_make_non_admin_button(self): - self.browser.find_element_by_id("make_non_admin_button").click() + self.browser.find_element(By.ID, "make_non_admin_button").click() return self @@ -176,7 +177,7 @@ def leave_organisation_with_students(self): return TeachMoveClassesPage(self.browser) def _click_leave_button(self): - self.browser.find_element_by_id("leave_organisation_button").click() + self.browser.find_element(By.ID, "leave_organisation_button").click() def confirm_kick_with_students_dialog(self): self.confirm_dialog() diff --git a/portal/tests/pageObjects/portal/teach/dismiss_students_page.py b/portal/tests/pageObjects/portal/teach/dismiss_students_page.py index abe26b6d6..3f1374f42 100644 --- a/portal/tests/pageObjects/portal/teach/dismiss_students_page.py +++ b/portal/tests/pageObjects/portal/teach/dismiss_students_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from . import class_page from .teach_base_page import TeachBasePage @@ -11,14 +13,14 @@ def __init__(self, browser): assert self.on_correct_page("dismiss_students_page") def enter_email(self, email, id=0): - self.browser.find_element_by_id(f"id_form-{id}-email").send_keys(email) - self.browser.find_element_by_id(f"id_form-{id}-confirm_email").send_keys(email) + self.browser.find_element(By.ID, f"id_form-{id}-email").send_keys(email) + self.browser.find_element(By.ID, f"id_form-{id}-confirm_email").send_keys(email) return self def cancel(self): - self.browser.find_element_by_id("cancel_button").click() + self.browser.find_element(By.ID, "cancel_button").click() return class_page.TeachClassPage(self.browser) def dismiss(self): - self.browser.find_element_by_id("dismiss_button").click() + self.browser.find_element(By.ID, "dismiss_button").click() return class_page.TeachClassPage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/edit_student_page.py b/portal/tests/pageObjects/portal/teach/edit_student_page.py index 2d1e3b911..7843258f2 100644 --- a/portal/tests/pageObjects/portal/teach/edit_student_page.py +++ b/portal/tests/pageObjects/portal/teach/edit_student_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from . import class_page, onboarding_student_list_page from .teach_base_page import TeachBasePage @@ -11,26 +13,26 @@ def __init__(self, browser): assert self.on_correct_page("edit_student_page") def type_student_name(self, name): - self.browser.find_element_by_id("id_name").clear() - self.browser.find_element_by_id("id_name").send_keys(name) + self.browser.find_element(By.ID, "id_name").clear() + self.browser.find_element(By.ID, "id_name").send_keys(name) return self def type_student_password(self, password): - self.browser.find_element_by_id("id_password").send_keys(password) - self.browser.find_element_by_id("id_confirm_password").send_keys(password) + self.browser.find_element(By.ID, "id_password").send_keys(password) + self.browser.find_element(By.ID, "id_confirm_password").send_keys(password) return self def click_update_button(self): - self.browser.find_element_by_id("update_name_button").click() + self.browser.find_element(By.ID, "update_name_button").click() return class_page.TeachClassPage(self.browser) def click_update_button_fail(self): - self.browser.find_element_by_id("update_name_button").click() + self.browser.find_element(By.ID, "update_name_button").click() return self def click_set_password_button(self): - self.browser.find_element_by_id("set_new_password_button").click() + self.browser.find_element(By.ID, "set_new_password_button").click() return onboarding_student_list_page.OnboardingStudentListPage(self.browser) def is_student_name(self, name): - return name in self.browser.find_element_by_id("student_details").text + return name in self.browser.find_element(By.ID, "student_details").text diff --git a/portal/tests/pageObjects/portal/teach/move_class_page.py b/portal/tests/pageObjects/portal/teach/move_class_page.py index 35f2476ed..2f95dc397 100644 --- a/portal/tests/pageObjects/portal/teach/move_class_page.py +++ b/portal/tests/pageObjects/portal/teach/move_class_page.py @@ -1,5 +1,6 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from . import class_page @@ -14,16 +15,16 @@ def __init__(self, browser): assert self.on_correct_page("teach_move_class_page") def get_list_length(self): - return len(self.browser.find_element_by_id("id_new_teacher").find_elements_by_tag_name("option")) + return len(self.browser.find_element(By.ID, "id_new_teacher").find_elements(By.TAG_NAME, "option")) def select_teacher_by_index(self, teacher_index): - Select(self.browser.find_element_by_id("id_new_teacher")).select_by_index(teacher_index) + Select(self.browser.find_element(By.ID, "id_new_teacher")).select_by_index(teacher_index) return self def cancel(self): - self.browser.find_element_by_id("cancel_button").click() + self.browser.find_element(By.ID, "cancel_button").click() return class_page.TeachClassPage(self.browser) def move(self): - self.browser.find_element_by_id("move_button").click() + self.browser.find_element(By.ID, "move_button").click() return dashboard_page.TeachDashboardPage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/move_classes_page.py b/portal/tests/pageObjects/portal/teach/move_classes_page.py index 93e800518..c127aa3e8 100644 --- a/portal/tests/pageObjects/portal/teach/move_classes_page.py +++ b/portal/tests/pageObjects/portal/teach/move_classes_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from .teach_base_page import TeachBasePage @@ -10,13 +12,13 @@ def __init__(self, browser): assert self.on_correct_page("move_all_classes_page") def move_and_kick(self): - self.browser.find_element_by_id("move_classes_button").click() + self.browser.find_element(By.ID, "move_classes_button").click() import portal.tests.pageObjects.portal.teach.dashboard_page as dashboard_page return dashboard_page.TeachDashboardPage(self.browser) def move_and_leave(self): - self.browser.find_element_by_id("move_classes_button").click() + self.browser.find_element(By.ID, "move_classes_button").click() import portal.tests.pageObjects.portal.teach.onboarding_organisation_page as onboarding_organisation_page return onboarding_organisation_page.OnboardingOrganisationPage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py b/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py index 621cef3a1..3321f062f 100644 --- a/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py +++ b/portal/tests/pageObjects/portal/teach/move_students_disambiguate_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from . import class_page from .teach_base_page import TeachBasePage @@ -11,9 +13,9 @@ def __init__(self, browser): assert self.on_correct_page("move_students_disambiguate_page") def cancel(self): - self.browser.find_element_by_id("cancel_button").click() + self.browser.find_element(By.ID, "cancel_button").click() return class_page.TeachClassPage(self.browser) def move(self): - self.browser.find_element_by_id("move_button").click() + self.browser.find_element(By.ID, "move_button").click() return class_page.TeachClassPage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/move_students_page.py b/portal/tests/pageObjects/portal/teach/move_students_page.py index 6ef6d8b2e..90adcfa8d 100644 --- a/portal/tests/pageObjects/portal/teach/move_students_page.py +++ b/portal/tests/pageObjects/portal/teach/move_students_page.py @@ -1,5 +1,6 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from . import class_page @@ -14,16 +15,16 @@ def __init__(self, browser): assert self.on_correct_page("move_students_page") def get_list_length(self): - return len(self.browser.find_element_by_id("id_new_class").find_elements_by_tag_name("option")) + return len(self.browser.find_element(By.ID, "id_new_class").find_elements(By.TAG_NAME, "option")) def select_class_by_index(self, teacher_index): - Select(self.browser.find_element_by_id("id_new_class")).select_by_index(teacher_index) + Select(self.browser.find_element(By.ID, "id_new_class")).select_by_index(teacher_index) return self def cancel(self): - self.browser.find_element_by_id("cancel_button").click() + self.browser.find_element(By.ID, "cancel_button").click() return class_page.TeachClassPage(self.browser) def move(self): - self.browser.find_element_by_id("move_button").click() + self.browser.find_element(By.ID, "move_button").click() return move_students_disambiguate_page.TeachMoveStudentsDisambiguatePage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py b/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py index c16ff5126..35d20d130 100644 --- a/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py +++ b/portal/tests/pageObjects/portal/teach/onboarding_classes_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from . import onboarding_students_page from .teach_base_page import TeachBasePage @@ -11,9 +13,9 @@ def __init__(self, browser): assert self.on_correct_page("onboarding_classes_page") def create_class(self, name, classmate_progress): - self.browser.find_element_by_id("id_class_name").send_keys(name) + self.browser.find_element(By.ID, "id_class_name").send_keys(name) if classmate_progress: - self.browser.find_element_by_id("id_classmate_progress").click() + self.browser.find_element(By.ID, "id_classmate_progress").click() self._click_create_class_button() @@ -25,7 +27,7 @@ def create_class_empty(self): return self def _click_create_class_button(self): - self.browser.find_element_by_id("create_class_button").click() + self.browser.find_element(By.ID, "create_class_button").click() def does_not_have_classes(self): return self.element_does_not_exist_by_id("add_students") diff --git a/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py b/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py index 9930208f5..d0895c014 100644 --- a/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py +++ b/portal/tests/pageObjects/portal/teach/onboarding_organisation_page.py @@ -1,5 +1,6 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from . import onboarding_classes_page @@ -28,29 +29,29 @@ def create_organisation_empty(self): return self def _create_organisation(self, name, password, postcode, country): - self.browser.find_element_by_id("id_name").send_keys(name) - self.browser.find_element_by_id("id_postcode").send_keys(postcode) - country_element = self.browser.find_element_by_id("id_country") + self.browser.find_element(By.ID, "id_name").send_keys(name) + self.browser.find_element(By.ID, "id_postcode").send_keys(postcode) + country_element = self.browser.find_element(By.ID, "id_country") select = Select(country_element) select.select_by_value(country) self._click_create_school_button() def _click_create_school_button(self): - self.browser.find_element_by_name("create_organisation").click() + self.browser.find_element(By.NAME, "create_organisation").click() def has_creation_failed(self): if not self.element_exists_by_css(".errorlist"): return False errors = ( - self.browser.find_element_by_id("form-create-organisation").find_element_by_class_name("errorlist").text + self.browser.find_element(By.ID, "form-create-organisation").find_element(By.CLASS_NAME, "errorlist").text ) error = "There is already a school or club registered with that name and postcode" return error in errors def was_postcode_invalid(self): errors = ( - self.browser.find_element_by_id("form-create-organisation").find_element_by_class_name("errorlist").text + self.browser.find_element(By.ID, "form-create-organisation").find_element(By.CLASS_NAME, "errorlist").text ) error = "Please enter a valid postcode or ZIP code" return error in errors diff --git a/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py b/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py index 14efaf109..78d5dee3e 100644 --- a/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py +++ b/portal/tests/pageObjects/portal/teach/onboarding_student_list_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from . import class_page, dashboard_page from .teach_base_page import TeachBasePage @@ -11,18 +13,18 @@ def __init__(self, browser): assert self.on_correct_page("onboarding_student_list_page") def student_exists(self, name): - return name in self.browser.find_element_by_id("student_table").text + return name in self.browser.find_element(By.ID, "student_table").text def is_student_password(self, password): - return password in self.browser.find_element_by_xpath("//table[@id='student_table']/tbody/tr[4]/td[2]").text + return password in self.browser.find_element(By.XPATH, "//table[@id='student_table']/tbody/tr[4]/td[2]").text def go_back_to_class(self): - self.browser.find_element_by_id("back_to_class_button").click() + self.browser.find_element(By.ID, "back_to_class_button").click() return class_page.TeachClassPage(self.browser) def get_first_login_url(self): - return self.browser.find_element_by_xpath("//table[@id='student_table']/tbody/tr[4]/td[4]/div/div[1]").text + return self.browser.find_element(By.XPATH, "//table[@id='student_table']/tbody/tr[4]/td[4]/div/div[1]").text def complete_setup(self): - self.browser.find_element_by_id("complete_setup_button").click() + self.browser.find_element(By.ID, "complete_setup_button").click() return dashboard_page.TeachDashboardPage(self.browser) diff --git a/portal/tests/pageObjects/portal/teach/onboarding_students_page.py b/portal/tests/pageObjects/portal/teach/onboarding_students_page.py index efcac78ab..8ef2223d5 100644 --- a/portal/tests/pageObjects/portal/teach/onboarding_students_page.py +++ b/portal/tests/pageObjects/portal/teach/onboarding_students_page.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from selenium.webdriver.common.by import By + from . import onboarding_student_list_page from .teach_base_page import TeachBasePage @@ -26,8 +28,8 @@ def create_students_failure(self): return self def _click_create_students(self): - self.browser.find_element_by_name("new_students").click() + self.browser.find_element(By.NAME, "new_students").click() def type_student_name(self, name): - self.browser.find_element_by_id("id_names").send_keys(name + "\n") + self.browser.find_element(By.ID, "id_names").send_keys(name + "\n") return self diff --git a/portal/tests/pageObjects/portal/teach/teach_base_page.py b/portal/tests/pageObjects/portal/teach/teach_base_page.py index 9047d86e6..23e7a712a 100644 --- a/portal/tests/pageObjects/portal/teach/teach_base_page.py +++ b/portal/tests/pageObjects/portal/teach/teach_base_page.py @@ -1,5 +1,7 @@ from pathlib import Path +from selenium.webdriver.common.by import By + from portal.tests.pageObjects.portal.base_page import BasePage @@ -8,9 +10,9 @@ def __init__(self, browser): super(TeachBasePage, self).__init__(browser) def logout(self): - self.browser.find_element_by_id("logout_menu").click() + self.browser.find_element(By.ID, "logout_menu").click() - self.browser.find_element_by_id("logout_button").click() + self.browser.find_element(By.ID, "logout_button").click() from portal.tests.pageObjects.portal.home_page import HomePage return HomePage(self.browser) @@ -27,11 +29,11 @@ def import_students_from_csv(self, filename): }) """ ) - self.browser.find_element_by_xpath("/html/body/input").send_keys( + self.browser.find_element(By.XPATH, "/html/body/input").send_keys( str((Path(__file__).parents[3] / "data" / filename).resolve()) ) return self def get_students_input_value(self): - return self.browser.find_element_by_id("id_names").get_attribute("value") + return self.browser.find_element(By.ID, "id_names").get_attribute("value") diff --git a/portal/tests/pageObjects/portal/teacher_login_page.py b/portal/tests/pageObjects/portal/teacher_login_page.py index 6f21e86b7..91368e8a8 100644 --- a/portal/tests/pageObjects/portal/teacher_login_page.py +++ b/portal/tests/pageObjects/portal/teacher_login_page.py @@ -1,7 +1,8 @@ +from selenium.webdriver.common.by import By + from .base_page import BasePage from .password_reset_page import PasswordResetPage from .teach import dashboard_page as teach_dashboard_page -from .teach import onboarding_classes_page, onboarding_students_page class TeacherLoginPage(BasePage): @@ -15,9 +16,9 @@ def login(self, email, password): return teach_dashboard_page.TeachDashboardPage(self.browser) def _login(self, email, password): - self.browser.find_element_by_id("id_auth-username").send_keys(email) - self.browser.find_element_by_id("id_auth-password").send_keys(password) - self.browser.find_element_by_name("login_view").click() + self.browser.find_element(By.ID, "id_auth-username").send_keys(email) + self.browser.find_element(By.ID, "id_auth-password").send_keys(password) + self.browser.find_element(By.NAME, "login_view").click() def login_no_school(self, email, password): self._login(email, password) @@ -40,9 +41,9 @@ def login_failure(self, email, password): return self def has_login_failed(self, form_id, error): - errors = self.browser.find_element_by_id(form_id).find_element_by_class_name("errorlist").text + errors = self.browser.find_element(By.ID, form_id).find_element(By.CLASS_NAME, "errorlist").text return error in errors def go_to_teacher_forgotten_password_page(self): - self.browser.find_element_by_id("teacher_forgotten_password_button").click() + self.browser.find_element(By.ID, "teacher_forgotten_password_button").click() return PasswordResetPage(self.browser) diff --git a/portal/tests/test_independent_student.py b/portal/tests/test_independent_student.py index 0779cc377..4af7b0562 100644 --- a/portal/tests/test_independent_student.py +++ b/portal/tests/test_independent_student.py @@ -19,6 +19,7 @@ from django.core import mail from django.test import Client, TestCase from django.urls import reverse +from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from portal.forms.error_messages import INVALID_LOGIN_MESSAGE @@ -171,30 +172,30 @@ def test_delete_indy_account(self): user_id = user.id # first check if a wrong password triggers the error - unsubscribe_newsletter_checkbox = page.browser.find_element_by_name("unsubscribe_newsletter") + unsubscribe_newsletter_checkbox = page.browser.find_element(By.NAME, "unsubscribe_newsletter") unsubscribe_newsletter_checkbox.click() - delete_account_form = page.browser.find_element_by_name("delete_password") + delete_account_form = page.browser.find_element(By.NAME, "delete_password") delete_account_form.send_keys("123") # wrong password - delete_account_button = page.browser.find_element_by_id("delete_account_button") + delete_account_button = page.browser.find_element(By.ID, "delete_account_button") delete_account_button.click() assert ( - page.browser.find_element_by_css_selector("#form-delete-indy-account > ul > li").text + page.browser.find_element(By.CSS_SELECTOR, "#form-delete-indy-account > ul > li").text == "Incorrect password" ) # now delete the account - unsubscribe_newsletter_checkbox = page.browser.find_element_by_name("unsubscribe_newsletter") + unsubscribe_newsletter_checkbox = page.browser.find_element(By.NAME, "unsubscribe_newsletter") unsubscribe_newsletter_checkbox.click() - delete_account_form = page.browser.find_element_by_name("delete_password") + delete_account_form = page.browser.find_element(By.NAME, "delete_password") delete_account_form.send_keys(password) - delete_account_button = page.browser.find_element_by_id("delete_account_button") + delete_account_button = page.browser.find_element(By.ID, "delete_account_button") delete_account_button.click() - delete_button_confirm = page.browser.find_element_by_id("delete_button") + delete_button_confirm = page.browser.find_element(By.ID, "delete_button") delete_button_confirm.click() # check if can still login to the account diff --git a/portal/tests/test_invite_teacher.py b/portal/tests/test_invite_teacher.py index 09bdd2c3c..8251f6997 100644 --- a/portal/tests/test_invite_teacher.py +++ b/portal/tests/test_invite_teacher.py @@ -12,7 +12,6 @@ from django.test import Client, TestCase from django.urls import reverse from django.utils import timezone -from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait @@ -182,12 +181,12 @@ def test_revoke_and_make_admin_invite(self): # Generate an invite and make admin invite_data = {"teacher_first_name": "Adam", "teacher_last_name": "NotAdam", "teacher_email": "adam@adam.not"} for key in invite_data.keys(): - field = page.browser.find_element_by_name(key) + field = page.browser.find_element(By.NAME, key) field.send_keys(invite_data[key]) # check if invite text for a user has been generated click_buttons_by_id(page, self, "invite_teacher_button") - banner = page.browser.find_element_by_id("messages") + banner = page.browser.find_element(By.ID, "messages") assert ( f"You have invited {invite_data['teacher_first_name']} {invite_data['teacher_last_name']} to your school." in banner.text @@ -198,13 +197,13 @@ def test_revoke_and_make_admin_invite(self): click_buttons_by_id(page, self, ["make_admin_button_invite", "add_admin_button"]) invite = SchoolTeacherInvitation.objects.filter(invited_teacher_first_name="Adam")[0] assert invite.invited_teacher_is_admin - banner = page.browser.find_element_by_id("messages") + banner = page.browser.find_element(By.ID, "messages") assert "Administrator invite status has been given successfully" in banner.text # revoke admin click_buttons_by_id(page, self, "make_non_admin_button_invite") - banner = page.browser.find_element_by_id("messages") + banner = page.browser.find_element(By.ID, "messages") assert "Administrator invite status has been revoked successfully" in banner.text def test_delete_invite(self): @@ -219,9 +218,9 @@ def test_delete_invite(self): # Generate an invite invite_data = {"teacher_first_name": "Adam", "teacher_last_name": "NotAdam", "teacher_email": "adam@adam.not"} for key in invite_data.keys(): - field = page.browser.find_element_by_name(key) + field = page.browser.find_element(By.NAME, key) field.send_keys(invite_data[key]) - invite_button = page.browser.find_element_by_name("invite_teacher_button") + invite_button = page.browser.find_element(By.NAME, "invite_teacher_button") invite_button.click() # check object was created @@ -249,12 +248,12 @@ def test_resend_invite(self): # Generate an invite invite_data = {"teacher_first_name": "Adam", "teacher_last_name": "NotAdam", "teacher_email": "adam@adam.not"} for key in invite_data.keys(): - field = page.browser.find_element_by_name(key) + field = page.browser.find_element(By.NAME, key) field.send_keys(invite_data[key]) click_buttons_by_id(page, self, "invite_teacher_button") - banner = page.browser.find_element_by_xpath('//*[@id="messages"]/div/div/div/div/div/p') + banner = page.browser.find_element(By.XPATH, '//*[@id="messages"]/div/div/div/div/div/p') assert ( banner.text == f"You have invited {invite_data['teacher_first_name']} {invite_data['teacher_last_name']} to your school." diff --git a/portal/tests/test_organisation.py b/portal/tests/test_organisation.py index 19e39cd8d..7e39b554b 100644 --- a/portal/tests/test_organisation.py +++ b/portal/tests/test_organisation.py @@ -11,6 +11,7 @@ ) from common.tests.utils.student import create_school_student_directly from common.tests.utils.teacher import signup_teacher_directly +from selenium.webdriver.common.by import By from portal.tests.pageObjects.portal.base_page import BasePage from portal.tests.pageObjects.portal.home_page import HomePage @@ -146,7 +147,7 @@ def test_toggle_admin(self): page = page.click_make_admin_button() time.sleep(FADE_TIME) - popup_make_admin_button = page.browser.find_element_by_id("add_admin_button") + popup_make_admin_button = page.browser.find_element(By.ID, "add_admin_button") assert popup_make_admin_button.text == "Add as admin" popup_make_admin_button.click() @@ -172,7 +173,7 @@ def test_disable_2FA(self): page = page.click_make_admin_button() # check if the new popup appears time.sleep(FADE_TIME) - make_admin_button = page.browser.find_element_by_id("add_admin_button") + make_admin_button = page.browser.find_element(By.ID, "add_admin_button") assert make_admin_button.text == "Add as admin" make_admin_button.click() diff --git a/portal/tests/test_teacher.py b/portal/tests/test_teacher.py index ad8ad9545..eec97dcef 100644 --- a/portal/tests/test_teacher.py +++ b/portal/tests/test_teacher.py @@ -648,7 +648,7 @@ def test_reset_with_same_password(self): page.reset_password_fail(password) - message = page.browser.find_element_by_class_name("errorlist") + message = page.browser.find_element(By.CLASS_NAME, "errorlist") assert "Please choose a password that you haven't used before" in message.text def test_reset_password_fail(self): @@ -684,7 +684,7 @@ def test_admin_sees_all_school_classes(self): join_teacher_to_organisation(admin_email, school.name, school.postcode, is_admin=True) page = self.go_to_homepage().go_to_teacher_login_page().login(admin_email, admin_password).open_classes_tab() - class_code_field = page.browser.find_element_by_id(f"class-code-{access_code}") + class_code_field = page.browser.find_element(By.ID, f"class-code-{access_code}") assert class_code_field.text == access_code def test_admin_student_edit(self): @@ -711,7 +711,7 @@ def test_admin_student_edit(self): ) edit_student_button.click() - title = page.browser.find_element_by_id("student_details") + title = page.browser.find_element(By.ID, "student_details") assert title.text == f"Edit student details for {student_name} from class {klass} ({access_code})" def test_make_admin_popup(self): @@ -723,10 +723,10 @@ def test_make_admin_popup(self): invite_data = {"teacher_first_name": "Real", "teacher_last_name": "Name", "teacher_email": "ren@me.me"} for key in invite_data.keys(): - field = page.browser.find_element_by_name(key) + field = page.browser.find_element(By.NAME, key) field.send_keys(invite_data[key]) - invite_button = page.browser.find_element_by_name("invite_teacher_button") + invite_button = page.browser.find_element(By.NAME, "invite_teacher_button") invite_button.click() # Once invite sent test the make admin button @@ -744,9 +744,9 @@ def test_make_admin_popup(self): # admin checked also makes a popup for key in invite_data.keys(): - field = page.browser.find_element_by_name(key) + field = page.browser.find_element(By.NAME, key) field.send_keys(invite_data[key]) - checkbox = page.browser.find_element_by_name("make_admin_ticked") + checkbox = page.browser.find_element(By.NAME, "make_admin_ticked") checkbox.click() button_ids = ["invite_teacher_button", "cancel_admin_popup_button"] @@ -773,28 +773,28 @@ def test_delete_account(self): page = HomePage(self.selenium).go_to_teacher_login_page().login(email, password).open_account_tab() # test incorrect password - page.browser.find_element_by_id("id_delete_password").send_keys("IncorrectPassword") - page.browser.find_element_by_id("delete_account_button").click() + page.browser.find_element(By.ID, "id_delete_password").send_keys("IncorrectPassword") + page.browser.find_element(By.ID, "delete_account_button").click() is_message_showing(page.browser, "Your account was not deleted") # test cancel (no class) time.sleep(FADE_TIME) - page.browser.find_element_by_id("id_delete_password").clear() - page.browser.find_element_by_id("id_delete_password").send_keys(password) - page.browser.find_element_by_id("delete_account_button").click() + page.browser.find_element(By.ID, "id_delete_password").clear() + page.browser.find_element(By.ID, "id_delete_password").send_keys(password) + page.browser.find_element(By.ID, "delete_account_button").click() time.sleep(FADE_TIME) - assert page.browser.find_element_by_id("popup-delete-review").is_displayed() - page.browser.find_element_by_id("cancel_popup_button").click() + assert page.browser.find_element(By.ID, "popup-delete-review").is_displayed() + page.browser.find_element(By.ID, "cancel_popup_button").click() time.sleep(FADE_TIME) # test close button in the corner - page.browser.find_element_by_id("id_delete_password").clear() - page.browser.find_element_by_id("id_delete_password").send_keys(password) - page.browser.find_element_by_id("delete_account_button").click() + page.browser.find_element(By.ID, "id_delete_password").clear() + page.browser.find_element(By.ID, "id_delete_password").send_keys(password) + page.browser.find_element(By.ID, "delete_account_button").click() time.sleep(FADE_TIME) - page.browser.find_element_by_id("close_popup_button").click() + page.browser.find_element(By.ID, "close_popup_button").click() time.sleep(FADE_TIME) # create class @@ -802,26 +802,26 @@ def test_delete_account(self): create_school_student_directly(access_code) # delete then review classes - page.browser.find_element_by_id("id_delete_password").send_keys(password) - page.browser.find_element_by_id("delete_account_button").click() + page.browser.find_element(By.ID, "id_delete_password").send_keys(password) + page.browser.find_element(By.ID, "delete_account_button").click() time.sleep(FADE_TIME) - assert page.browser.find_element_by_id("popup-delete-review").is_displayed() - page.browser.find_element_by_id("review_button").click() + assert page.browser.find_element(By.ID, "popup-delete-review").is_displayed() + page.browser.find_element(By.ID, "review_button").click() time.sleep(FADE_TIME) assert page.has_classes() page = page.open_account_tab() # test actual deletion - page.browser.find_element_by_id("id_delete_password").send_keys(password) - page.browser.find_element_by_id("delete_account_button").click() + page.browser.find_element(By.ID, "id_delete_password").send_keys(password) + page.browser.find_element(By.ID, "delete_account_button").click() time.sleep(FADE_TIME) - page.browser.find_element_by_id("delete_button").click() + page.browser.find_element(By.ID, "delete_button").click() # back to homepage - assert page.browser.find_element_by_class_name("banner--homepage") + assert page.browser.find_element(By.CLASS_NAME, "banner--homepage") # user should not be able to login now page = HomePage(self.selenium).go_to_teacher_login_page().login_failure(email, password) diff --git a/portal/tests/test_teacher_student.py b/portal/tests/test_teacher_student.py index c0a7102d4..8f7dc0aef 100644 --- a/portal/tests/test_teacher_student.py +++ b/portal/tests/test_teacher_student.py @@ -17,6 +17,7 @@ from django.test import Client from django.urls import reverse from selenium.webdriver.common.alert import Alert +from selenium.webdriver.common.by import By from portal.tests.pageObjects.portal.home_page import HomePage from .base_test import BaseTest @@ -226,7 +227,7 @@ def test_new_student_can_login_with_url(self): login_url = page.get_first_login_url() page.browser.get(login_url) assert page.on_correct_page("play_dashboard_page") - assert new_student_name in page.browser.find_element_by_xpath("//div[@class='header']").text + assert new_student_name in page.browser.find_element(By.XPATH, "//div[@class='header']").text def test_update_student_name(self): email, password = signup_teacher_directly() diff --git a/portal/tests/utils/messages.py b/portal/tests/utils/messages.py index 4bcbf580b..98007c682 100644 --- a/portal/tests/utils/messages.py +++ b/portal/tests/utils/messages.py @@ -1,5 +1,7 @@ +from selenium.webdriver.common.by import By + def is_message_showing(browser, message): - return message in browser.find_element_by_id("messages").text + return message in browser.find_element(By.ID, "messages").text def is_email_verified_message_showing(browser):