├── canopyStarterKit ├── paket.references ├── pages │ ├── PageElementWithin.fs │ └── PageIndex.fs ├── tests │ ├── Misc.fs │ ├── Elements.fs │ ├── Assertions.fs │ └── Actions.fs ├── AssemblyInfo.fs ├── Program.fs ├── App.config ├── canopyStarterKit.sln ├── Args.fs ├── Common.fs ├── Tests.fs └── canopyStarterKit.fsproj ├── .paket └── paket.bootstrapper.exe ├── paket.dependencies ├── setupDeb.sh ├── README.md ├── paket.lock ├── .travis.yml ├── LICENSE ├── canopyStarterKit.sln └── .gitignore /canopyStarterKit/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | canopy 3 | argu -------------------------------------------------------------------------------- /.paket/paket.bootstrapper.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lefthandedgoat/canopyStarterKit/HEAD/.paket/paket.bootstrapper.exe -------------------------------------------------------------------------------- /canopyStarterKit/pages/PageElementWithin.fs: -------------------------------------------------------------------------------- 1 | module PageElementWithin 2 | 3 | let uri = "http://lefthandedgoat.github.io/canopy/testpages/elementWithin" 4 | 5 | //selectors 6 | let items = ".item" 7 | let specialItems = ".specialItem" 8 | -------------------------------------------------------------------------------- /paket.dependencies: -------------------------------------------------------------------------------- 1 | source https://nuget.org/api/v2 2 | 3 | framework: net45 4 | 5 | nuget FSharp.Core redirects:force 6 | 7 | nuget FAKE 8 | nuget canopy 9 | nuget argu 10 | 11 | nuget Selenium.WebDriver.ChromeDriver 12 | nuget Selenium.WebDriver.GeckoDriver.Win32 -------------------------------------------------------------------------------- /canopyStarterKit/pages/PageIndex.fs: -------------------------------------------------------------------------------- 1 | module PageIndex 2 | 3 | let uri = "http://lefthandedgoat.github.io/canopy/testpages/" 4 | 5 | //selectors 6 | let firstName = "#firstName" 7 | let firstNameXpath = "id('firstName')" 8 | let lastName = "#lastName" 9 | let lastNameXpath = "//input[@class='lastName']" 10 | let lastName2 = "#lastName2" 11 | let lastNameClass = ".lastName" 12 | -------------------------------------------------------------------------------- /setupDeb.sh: -------------------------------------------------------------------------------- 1 | #https://github.com/lefthandedgoat/canopy/issues/320 2 | 3 | wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - 4 | sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' 5 | 6 | sudo apt-get -y --force-yes update 7 | 8 | sudo apt-get -y install mono-complete fsharp 9 | 10 | sudo apt-get -y install google-chrome-stable 11 | 12 | sudo apt-get -y install xvfb -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | canopy Starter Kits allows a quick clone/rename/code approach to getting started with canopy and UI Automation. 2 | 3 | On Windows run `build.cmd` 4 | 5 | On OSX run `sh build.sh` (on linux, you need to download the chromedriver linux binary and replace the current `chromedriver` file) 6 | 7 | For linux I have created a script to take a base install of Ubuntu Server 16.04 and get everything set up. 8 | 9 | Just clone and cd to dir then run `sudo sh setupDeb.sh` 10 | 11 | Then run `DISPLAY=:1 xvfb-run sh buildLinux.sh` and it should work 'headless' 12 | -------------------------------------------------------------------------------- /paket.lock: -------------------------------------------------------------------------------- 1 | RESTRICTION: == net45 2 | NUGET 3 | remote: https://www.nuget.org/api/v2 4 | Argu (2.1) 5 | canopy (1.1.4) 6 | FSharp.Core (>= 3.0.2) 7 | Selenium.WebDriver (3.0) 8 | FAKE (4.52) 9 | FSharp.Core (4.1) - redirects: force 10 | System.ValueTuple (>= 4.3) 11 | Selenium.WebDriver (3.0) 12 | Selenium.WebDriver.ChromeDriver (2.35) 13 | Selenium.WebDriver.GeckoDriver (0.19.1) 14 | Selenium.WebDriver.GeckoDriver.Win32 (0.19.1) 15 | Selenium.WebDriver.GeckoDriver (>= 0.19.1) 16 | System.ValueTuple (4.3) - redirects: force 17 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: csharp 2 | sudo: true # use the new container-based Travis infrastructure 3 | dist: trusty 4 | 5 | before_script: 6 | - "export DISPLAY=:99.0" 7 | - "sh -e /etc/init.d/xvfb start" 8 | - sleep 3 # give xvfb some time to start 9 | 10 | before_install: 11 | - chmod +x build.sh 12 | 13 | install: 14 | - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - 15 | - sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' 16 | - sudo apt-get update 17 | - sudo apt-get install google-chrome-stable 18 | 19 | script: 20 | - ./build.sh Dev -------------------------------------------------------------------------------- /canopyStarterKit/tests/Misc.fs: -------------------------------------------------------------------------------- 1 | module Misc 2 | 3 | open canopy 4 | 5 | let smoke () = 6 | context "smoke tests for misc canopy features" 7 | before (fun _ -> url PageIndex.uri) 8 | 9 | "intentionally skipped shows blue in LiveHtmlReport" &&! skipped 10 | 11 | "Apostrophes don't break anything" &&& fun _ -> 12 | count "I've got an apostrophe" 1 13 | 14 | let full () = 15 | context "full tests for misc canopy features" 16 | before (fun _ -> url PageIndex.uri) 17 | 18 | ntest "find by label, following field" (fun _ -> 19 | "Test Field 1" == "test value 1") 20 | 21 | test (fun _ -> 22 | describe "find by label, for attribute" 23 | "Test Field 2" == "test value 2") 24 | 25 | let all () = 26 | smoke() 27 | full() 28 | -------------------------------------------------------------------------------- /canopyStarterKit/AssemblyInfo.fs: -------------------------------------------------------------------------------- 1 | // Auto-Generated by FAKE; do not edit 2 | namespace System 3 | open System.Reflection 4 | 5 | [] 6 | [] 7 | [] 8 | [] 9 | [] 10 | do () 11 | 12 | module internal AssemblyVersionInformation = 13 | let [] AssemblyTitle = "canopyStarterKit" 14 | let [] AssemblyProduct = "canopyStarterKit" 15 | let [] AssemblyDescription = "Starter kit for UI automation with canopy" 16 | let [] AssemblyVersion = "1.0" 17 | let [] AssemblyFileVersion = "1.0" 18 | -------------------------------------------------------------------------------- /canopyStarterKit/Program.fs: -------------------------------------------------------------------------------- 1 | module Program 2 | 3 | open canopy 4 | open reporters 5 | open Common 6 | 7 | [] 8 | let main argv = 9 | //Parse all the args into the types that we use in the rest of the code 10 | let args = Args.parse argv 11 | 12 | configuration.chromeDir <- executingDir() 13 | reporter <- new LiveHtmlReporter(Chrome, configuration.chromeDir) :> IReporter 14 | reporter.setEnvironment "canopy test page" 15 | 16 | //Start the browser supplied in args 17 | start args.Browser 18 | 19 | //Register the tests that you want to run (under development, a specific page, all tests, etc) 20 | Tests.register args.Tag args.TestType 21 | //Run tests 22 | run() 23 | 24 | System.Console.ReadKey() |> ignore 25 | //Quit all browsers 26 | quit () 27 | 28 | //return code 29 | canopy.runner.failedCount 30 | -------------------------------------------------------------------------------- /canopyStarterKit/tests/Elements.fs: -------------------------------------------------------------------------------- 1 | module Elementz 2 | 3 | open canopy 4 | open PageElementWithin 5 | 6 | let smoke () = 7 | context "smoke elements" 8 | before (fun _ -> url PageElementWithin.uri) 9 | 10 | "element within only searching within the element" &&& fun _ -> 11 | count items 5 12 | "spanned item 4" === (element "span" |> elementWithin items).Text 13 | 14 | let full () = 15 | context "full elements" 16 | before (fun _ -> url PageElementWithin.uri) 17 | 18 | "elements within only searching within element" &&& fun _ -> 19 | count items 5 20 | 2 === (element "span" |> elementsWithin items |> List.length) 21 | 22 | "someElementWithin only searching within element" &&& fun _ -> 23 | count ".item" 5 24 | true === (element "span" |> someElementWithin specialItems).IsSome 25 | 26 | let all () = 27 | smoke() 28 | full() 29 | -------------------------------------------------------------------------------- /canopyStarterKit/tests/Assertions.fs: -------------------------------------------------------------------------------- 1 | module Assertions 2 | 3 | open canopy 4 | open PageIndex 5 | 6 | let smoke () = 7 | context "smoke assertions" 8 | before (fun _ -> url PageIndex.uri) 9 | 10 | "#firstName should have John (using == infix operator)" &&& fun _ -> 11 | firstName == "John" 12 | 13 | let full () = 14 | context "full assertions" 15 | before (fun _ -> url PageIndex.uri) 16 | 17 | "id('firstName') should have John (using == infix operator), basic xpath test" &&& fun _ -> 18 | firstNameXpath == "John" 19 | 20 | "#lastName should have Doe" &&& fun _ -> 21 | lastName == "Doe" 22 | 23 | "#lastName should have Doe via read cssSelector" &&& fun _ -> 24 | read lastName |> is "Doe" 25 | 26 | "#lastName should have Doe via read IWebElements" &&& fun _ -> 27 | element lastName |> read |> is "Doe" 28 | 29 | let all () = 30 | smoke() 31 | full() 32 | -------------------------------------------------------------------------------- /canopyStarterKit/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | True 11 | 12 | 13 | 14 | 15 | True 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /canopyStarterKit/canopyStarterKit.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2012 4 | Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "canopyStarterKit", "canopyStarterKit.fsproj", "{64EDF01D-DC76-43CF-8BC2-5157B841511E}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | EndGlobal 18 | -------------------------------------------------------------------------------- /canopyStarterKit/Args.fs: -------------------------------------------------------------------------------- 1 | module Args 2 | 3 | open Argu 4 | open Common 5 | 6 | type private CLIArguments = 7 | | Browser of string 8 | | Tag of string 9 | | TestType of string 10 | with 11 | interface IArgParserTemplate with 12 | member s.Usage = 13 | match s with 14 | | Browser _ -> "specicfy a browser (Chrome Firefox IE)." 15 | | Tag _ -> "specify tag (All Misc etc)." 16 | | TestType _ -> "specify testType (All Smoke Full UnderDevelopment)." 17 | 18 | let parse cliargs = 19 | let parser = ArgumentParser.Create() 20 | let results = parser.Parse(cliargs, errorHandler=ProcessExiter()) 21 | 22 | { 23 | Browser = defaultArg (results.TryPostProcessResult (<@ Browser @>, fromString)) canopy.types.BrowserStartMode.Chrome 24 | Tag = defaultArg (results.TryPostProcessResult (<@ Tag @>, fromString)) Tag.All 25 | TestType = defaultArg (results.TryPostProcessResult (<@ TestType @>, fromString)) TestType.Smoke 26 | } 27 | -------------------------------------------------------------------------------- /canopyStarterKit/Common.fs: -------------------------------------------------------------------------------- 1 | module Common 2 | 3 | open Microsoft.FSharp.Reflection 4 | 5 | //helper funcs 6 | let fromString<'a> s = 7 | match FSharpType.GetUnionCases typeof<'a> |> Array.filter (fun case -> case.Name = s) with 8 | | [|case|] -> FSharpValue.MakeUnion(case,[||]) :?> 'a 9 | | _ -> failwith <| sprintf "Can't convert %s to DU" s 10 | 11 | let executingDir () = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) 12 | 13 | //types 14 | //A Tag is a description of a type of tests you may want to run, generally covering a page or set of functionality 15 | type Tag = 16 | | All 17 | | Actions 18 | | Assertions 19 | | Elements 20 | | Misc 21 | 22 | //A TestType lets you break tests up in a second way, not by functionality, but maybe by coverage, or environment 23 | type TestType = 24 | | All 25 | | Smoke 26 | | Full 27 | | UnderDevelopment 28 | 29 | type Arguments = 30 | { 31 | Browser : canopy.types.BrowserStartMode 32 | Tag : Tag 33 | TestType : TestType 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Chris Holt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /canopyStarterKit.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2010 4 | Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "canopyStarterKit", "canopyStarterKit\canopyStarterKit.fsproj", "{64EDF01D-DC76-43CF-8BC2-5157B841511E}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | Debug|x86 = Debug|x86 11 | Release|x86 = Release|x86 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Release|Any CPU.Build.0 = Release|Any CPU 18 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Debug|x86.ActiveCfg = Debug|Any CPU 19 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Debug|x86.Build.0 = Debug|Any CPU 20 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Release|x86.ActiveCfg = Release|Any CPU 21 | {64EDF01D-DC76-43CF-8BC2-5157B841511E}.Release|x86.Build.0 = Release|Any CPU 22 | EndGlobalSection 23 | EndGlobal 24 | -------------------------------------------------------------------------------- /canopyStarterKit/tests/Actions.fs: -------------------------------------------------------------------------------- 1 | module Actions 2 | 3 | open canopy 4 | open PageIndex 5 | 6 | let smoke () = 7 | context "smoke actions" 8 | before (fun _ -> url PageIndex.uri) 9 | 10 | "clearing #firstName sets text to new empty string" &&& fun _ -> 11 | clear firstName 12 | firstName == "" 13 | 14 | "writing to #lastName sets text to Smith" &&& fun _ -> 15 | clear lastName 16 | lastName << "Smith" 17 | lastName == "Smith" 18 | 19 | "writing to .lastName sets text to new Smith in both boxes" &&& fun _ -> 20 | clear lastName 21 | lastNameClass << "Smith" 22 | lastName == "Smith" 23 | lastName2 == "Smith" 24 | 25 | "writing to #lastName sets text to new Smith (implicit clear in write)" &&& fun _ -> 26 | lastName << "Smith" 27 | lastName == "Smith" 28 | 29 | let full () = 30 | context "full actions" 31 | before (fun _ -> url PageIndex.uri) 32 | 33 | "clearing #firstName sets text to new empty string via IWebElement" &&& fun _ -> 34 | element firstName |> clear 35 | firstName == "" 36 | 37 | "writing to #lastName (as element) sets text to John" &&& fun _ -> 38 | let lastname = element lastName 39 | clear lastname 40 | lastname << "John" 41 | lastName == "John" 42 | 43 | "writing to .lastName sets text to new Smith in both boxes, xpath test" &&& fun _ -> 44 | clear lastName 45 | lastNameXpath << "Smith" 46 | lastName == "Smith" 47 | lastName2 == "Smith" 48 | 49 | let all () = 50 | smoke() 51 | full() 52 | -------------------------------------------------------------------------------- /canopyStarterKit/Tests.fs: -------------------------------------------------------------------------------- 1 | module Tests 2 | 3 | open Common 4 | 5 | //The default argument passed from the console in the starter kit is UnderDevelopment 6 | //This lets you simply comment/uncomment the test context/suite that you are working on 7 | //As you add more tests for different pages, add an entry here 8 | let underDevelopment () = 9 | //Actions.all() 10 | //Assertions.all() 11 | //Elementz.all() 12 | Misc.all() 13 | 14 | //This is a list of all tests, which is useful when running in a CI environment where you want to 15 | //run all tests, or a specific type of test like Full/Smoke, or tests for a specific 16 | //page or set of functionality 17 | //Its is a list of a tuple of 3 things, a Tag, TestType, and a the function that wraps your actual tests 18 | //As you add more tests for different pages, add an entry/entries here 19 | let all = 20 | [ 21 | Actions, Smoke, Actions.smoke 22 | Assertions, Smoke, Assertions.smoke 23 | Elements, Smoke, Elementz.smoke 24 | Misc, Smoke, Misc.smoke 25 | 26 | Actions, Full, Actions.full 27 | Assertions, Full, Assertions.full 28 | Elements, Full, Elementz.full 29 | Misc, Full, Misc.full 30 | ] 31 | 32 | //Code below does not need to be changed in most cases, it simply takes all of the tests and removes ones that dont 33 | //meet the tags provided from arguments 34 | let register tag testType = 35 | let exec predicate = 36 | all 37 | |> List.filter predicate 38 | |> List.iter (fun (_,_,func) -> func()) 39 | 40 | match tag, testType with 41 | | (_, UnderDevelopment) -> underDevelopment() 42 | | (Tag.All, All) -> exec (fun _ -> true) 43 | | (Tag.All, testType) -> exec (fun (_, testType', _) -> testType' = testType) 44 | | (tag, All) -> exec (fun (tag', _, _) -> tag' = tag) 45 | | (tag, testType) -> exec (fun (tag', testType', _) -> tag' = tag && testType' = testType) 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | 9 | # Xamarin Studio / monodevelop user-specific 10 | *.userprefs 11 | *.dll.mdb 12 | *.exe.mdb 13 | 14 | # Build results 15 | 16 | [Dd]ebug/ 17 | [Rr]elease/ 18 | x64/ 19 | build/ 20 | [Bb]in/ 21 | [Oo]bj/ 22 | 23 | # MSTest test Results 24 | [Tt]est[Rr]esult*/ 25 | [Bb]uild[Ll]og.* 26 | 27 | *_i.c 28 | *_p.c 29 | *.ilk 30 | *.meta 31 | *.obj 32 | *.pch 33 | *.pdb 34 | *.pgc 35 | *.pgd 36 | *.rsp 37 | *.sbr 38 | *.tlb 39 | *.tli 40 | *.tlh 41 | *.tmp 42 | *.tmp_proj 43 | *.log 44 | *.vspscc 45 | *.vssscc 46 | .builds 47 | *.pidb 48 | *.log 49 | *.scc 50 | 51 | # Visual C++ cache files 52 | ipch/ 53 | *.aps 54 | *.ncb 55 | *.opensdf 56 | *.sdf 57 | *.cachefile 58 | 59 | # Visual Studio profiler 60 | *.psess 61 | *.vsp 62 | *.vspx 63 | 64 | # Other Visual Studio data 65 | .vs/ 66 | 67 | # Guidance Automation Toolkit 68 | *.gpState 69 | 70 | # ReSharper is a .NET coding add-in 71 | _ReSharper*/ 72 | *.[Rr]e[Ss]harper 73 | 74 | # TeamCity is a build add-in 75 | _TeamCity* 76 | 77 | # DotCover is a Code Coverage Tool 78 | *.dotCover 79 | 80 | # NCrunch 81 | *.ncrunch* 82 | .*crunch*.local.xml 83 | 84 | # Installshield output folder 85 | [Ee]xpress/ 86 | 87 | # DocProject is a documentation generator add-in 88 | DocProject/buildhelp/ 89 | DocProject/Help/*.HxT 90 | DocProject/Help/*.HxC 91 | DocProject/Help/*.hhc 92 | DocProject/Help/*.hhk 93 | DocProject/Help/*.hhp 94 | DocProject/Help/Html2 95 | DocProject/Help/html 96 | 97 | # Click-Once directory 98 | publish/ 99 | 100 | # Publish Web Output 101 | *.Publish.xml 102 | 103 | # Enable nuget.exe in the .nuget folder (though normally executables are not tracked) 104 | !.nuget/NuGet.exe 105 | 106 | # Windows Azure Build Output 107 | csx 108 | *.build.csdef 109 | 110 | # Windows Store app package directory 111 | AppPackages/ 112 | 113 | # Others 114 | sql/ 115 | *.Cache 116 | ClientBin/ 117 | [Ss]tyle[Cc]op.* 118 | ~$* 119 | *~ 120 | *.dbmdl 121 | *.[Pp]ublish.xml 122 | *.pfx 123 | *.publishsettings 124 | 125 | # RIA/Silverlight projects 126 | Generated_Code/ 127 | 128 | # Backup & report files from converting an old project file to a newer 129 | # Visual Studio version. Backup files are not needed, because we have git ;-) 130 | _UpgradeReport_Files/ 131 | Backup*/ 132 | UpgradeLog*.XML 133 | UpgradeLog*.htm 134 | 135 | # SQL Server files 136 | App_Data/*.mdf 137 | App_Data/*.ldf 138 | 139 | 140 | #LightSwitch generated files 141 | GeneratedArtifacts/ 142 | _Pvt_Extensions/ 143 | ModelManifest.xml 144 | 145 | # ========================= 146 | # Windows detritus 147 | # ========================= 148 | 149 | # Windows image file caches 150 | Thumbs.db 151 | ehthumbs.db 152 | 153 | # Folder config file 154 | Desktop.ini 155 | 156 | # Recycle Bin used on file shares 157 | $RECYCLE.BIN/ 158 | 159 | # Mac desktop service store files 160 | .DS_Store 161 | 162 | # =================================================== 163 | # Exclude F# project specific directories and files 164 | # =================================================== 165 | 166 | # NuGet Packages Directory 167 | packages/ 168 | 169 | # Generated documentation folder 170 | docs/output/ 171 | 172 | # Temp folder used for publishing docs 173 | temp/ 174 | 175 | # Test results produced by build 176 | TestResults.xml 177 | 178 | # Nuget outputs 179 | nuget/*.nupkg 180 | release.cmd 181 | release.sh 182 | localpackages/ 183 | paket-files 184 | *.orig 185 | .paket/paket.exe 186 | docs/content/license.md 187 | docs/content/release-notes.md 188 | .fake 189 | docs/tools/FSharp.Formatting.svclog 190 | -------------------------------------------------------------------------------- /canopyStarterKit/canopyStarterKit.fsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | 2.0 8 | {64EDF01D-DC76-43CF-8BC2-5157B841511E} 9 | Exe 10 | canopyStarterKit 11 | canopyStarterKit 12 | v4.5 13 | 4.4.0.0 14 | canopyStarterKit 15 | 16 | 8.0.30703 17 | 18 | 19 | true 20 | full 21 | false 22 | false 23 | bin\Debug 24 | DEBUG;TRACE 25 | 3 26 | --warnon:1182 27 | --browser Chrome --tag All --testtype UnderDevelopment 28 | 29 | 30 | pdbonly 31 | true 32 | true 33 | bin\Release 34 | TRACE 35 | 3 36 | .\bin\Release\canopyStarterKit.xml 37 | --warnon:1182 38 | true 39 | 40 | 41 | 11 42 | 43 | 44 | 45 | 46 | $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets 47 | 48 | 49 | 50 | 51 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets 52 | 53 | 54 | 55 | 56 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | PreserveNewest 77 | 78 | 79 | 80 | chromedriver_linux64 81 | PreserveNewest 82 | 83 | 84 | 85 | chromedriver_macOS 86 | PreserveNewest 87 | 88 | 89 | 90 | PreserveNewest 91 | 92 | 93 | 94 | Always 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | ..\packages\Argu\lib\net40\Argu.dll 109 | True 110 | True 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | ..\packages\canopy\lib\canopy.dll 120 | True 121 | True 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | ..\packages\FSharp.Core\lib\net40\FSharp.Core.dll 131 | True 132 | True 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | True 142 | 143 | 144 | ..\packages\Selenium.WebDriver\lib\net40\WebDriver.dll 145 | True 146 | True 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | ..\packages\System.ValueTuple\lib\netstandard1.0\System.ValueTuple.dll 156 | True 157 | True 158 | 159 | 160 | 161 | 162 | --------------------------------------------------------------------------------