(command.CommandList
  children: [
    (C {(set)} {(-o)} {(pipefail)})
    (C {(shopt)} {(-s)} {(extglob)})
    (command.FuncDef
      name: main
      body: 
        (command.BraceGroup
          children: [
            (C {(Lit_Other ':')} 
              {
                (DQ 
                  (word_part.BracedVarSub
                    token: <VSub_Name WEBDRIVER_URL>
                    suffix_op: 
                      (suffix_op.StringUnary
                        op_id: VTest_ColonEquals
                        arg_word: 
                          {('http:') (Lit_Slash /) (Lit_Slash /) ('127.0.0.1:4444') (Lit_Slash /) (wd) 
                            (Lit_Slash /) (hub)
                          }
                      )
                  )
                )
              }
            )
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:cmd)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (command.Case
              to_match: {($ VSub_DollarName '$cmd')}
              arms: [
                (case_arm pat_list:[{(new-session)}] action:[(C {(wd-new-session)})])
                (case_arm
                  pat_list: [{(delete-session)}]
                  action: [(C {(wd-delete-session)})]
                )
                (case_arm
                  pat_list: [{(go)}]
                  action: [(C {(wd-go)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(back)}]
                  action: [(C {(wd-post-session)} {(/back)})]
                )
                (case_arm
                  pat_list: [{(forward)}]
                  action: [(C {(wd-post-session)} {(/forward)})]
                )
                (case_arm
                  pat_list: [{(refresh)}]
                  action: [(C {(wd-post-session)} {(/refresh)})]
                )
                (case_arm
                  pat_list: [{(get-current-url)}]
                  action: [(C {(wd-get-current-url)})]
                )
                (case_arm pat_list:[{(get-title)}] action:[(C {(wd-get-title)})])
                (case_arm
                  pat_list: [{(get-page-source)} {(page-source)}]
                  action: [(C {(wd-get-page-source)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(get-window-handle)}]
                  action: [(C {(wd-get-window-handle)})]
                )
                (case_arm
                  pat_list: [{(get-window-handles)}]
                  action: [(C {(wd-get-window-handles)})]
                )
                (case_arm
                  pat_list: [{(switch-to-window)}]
                  action: [(C {(wd-switch-to-window)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(switch-to-frame)}]
                  action: [(C {(wd-switch-to-frame)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(switch-to-parent-frame)}]
                  action: [(C {(wd-post-session)} {(/frame/parent)})]
                )
                (case_arm
                  pat_list: [{(get-window-size)}]
                  action: [(C {(wd-get-window-size)})]
                )
                (case_arm
                  pat_list: [{(set-window-size)}]
                  action: [(C {(wd-set-window-size)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm pat_list:[{(maximize)}] action:[(C {(wd-maximize)})])
                (case_arm
                  pat_list: [{(find-element)} {(find)}]
                  action: [(C {(wd-find-element)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(find-elements)} {(find-all)}]
                  action: [(C {(wd-find-elements)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(find-element-in)} {(find-in)} {(find-element-from-element)}]
                  action: [(C {(wd-find-element-from-element)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(find-elements-in)} {(find-all-in)} {(find-elements-from-element)}]
                  action: [(C {(wd-find-elements-from-element)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(get-element-attribute)} {(attr)} {(attribute)}]
                  action: [(C {(wd-get-element-attribute)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(get-element-css-value)} {(css-value)}]
                  action: [(C {(wd-get-element-css-value)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(get-element-text)} {(text)}]
                  action: [(C {(wd-get-element-text)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(get-element-tag-name)} {(tag-name)}]
                  action: [(C {(wd-get-element-tag-name)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(is-element-selected)} {(is-selected)}]
                  action: [(C {(wd-is-element-selected)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(is-element-enabled)} {(is-enabled)}]
                  action: [(C {(wd-is-element-enabled)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(element-click)} {(click)}]
                  action: [(C {(wd-element-click)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(element-clear)} {(clear)}]
                  action: [(C {(wd-element-clear)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(element-send-keys)} {(send-keys)}]
                  action: [(C {(wd-element-send-keys)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(execute-script)} {(execute)} {(exec)}]
                  action: [(C {(wd-execute-script-sync)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(execute-script-async)} {(execute-async)} {(exec-async)}]
                  action: [(C {(wd-execute-script-async)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(get-all-cookies)} {(cookies)}]
                  action: [(C {(wd-get-all-cookies)})]
                )
                (case_arm
                  pat_list: [{(get-named-cookie)} {(cookie)}]
                  action: [(C {(wd-get-named-cookie)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(add-cookie)}]
                  action: [(C {(wd-add-cookie)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(delete-cookie)}]
                  action: [(C {(wd-delete-cookie)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm
                  pat_list: [{(delete-cookies)}]
                  action: [(C {(wd-delete-cookies)})]
                )
                (case_arm
                  pat_list: [{(take-screenshot)} {(screenshot)}]
                  action: [(C {(wd-take-screenshot)})]
                )
                (case_arm
                  pat_list: [{(take-element-screenshot)} {(element-screenshot)}]
                  action: [(C {(wd-take-element-screenshot)} {(DQ ($ VSub_At '$@'))})]
                )
                (case_arm pat_list:[{(help)}] action:[(C {(print-help)})])
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (command.SimpleCommand
                      words: [{(cat)}]
                      redirects: [
                        (redir.Redir
                          op: <Redir_GreatAnd '>&'>
                          fd: 16777215
                          arg_word: {(2)}
                        )
                        (redir.HereDoc
                          op: <Redir_DLess '<<'>
                          fd: 16777215
                          here_begin: {(.)}
                          here_end_span_id: 726
                          stdin_parts: [('Usage: wd <command> [arguments]\n') ('Help:  wd help\n')]
                        )
                      ]
                    )
                    (command.ControlFlow
                      token: <ControlFlow_Exit exit>
                      arg_word: {(1)}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.FuncDef
      name: die
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:rc)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (command.Sentence child:(C {(shift)}) terminator:<Op_Semi ';'>)
            (command.Sentence
              child: 
                (command.SimpleCommand
                  words: [{(echo)} {(DQ ($ VSub_Number '$0') (':'))} {(DQ ($ VSub_At '$@'))}]
                  redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
                )
              terminator: <Op_Semi ';'>
            )
            (command.ControlFlow
              token: <ControlFlow_Exit exit>
              arg_word: {(DQ ($ VSub_DollarName '$rc'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: json-obj
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {
                (SQ <'\n'> <'    use List::Util qw(pairmap);\n'> 
                  <'    $j = JSON::PP->new->allow_nonref;\n'> <'    print "{", join(",", pairmap { $j->encode($a) .":". $b } @ARGV), "}"\n'> <'  '>
                )
              } {(DQ ($ VSub_At '$@'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: json-arr
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-e)} {(SQ <'\n'> <'    print "[", join(",", @ARGV), "]"\n'> <'  '>)} 
              {(DQ ($ VSub_At '$@'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: json-str
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {(SQ <'print JSON::PP->new->allow_nonref->encode($ARGV[0])'>)} {(DQ ($ VSub_Number '$1'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: json-get
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {
                (SQ <'\n'> <'    local $/; my $s = <STDIN> || exit 1;\n'> 
                  <'    my $j = JSON::PP->new->allow_nonref;\n'> <'    my $data = $j->decode($s);\n'> <'    my $x = $data;\n'> <'    foreach (@ARGV) {\n'> 
                  <'      if (ref($x) eq "ARRAY") {\n'> <'        # convert array to k=>v hash\n'> <'        my %h = map { $_ => $x->[$_] } 0..$#$x;\n'> 
                  <'        $x = \\%h;\n'> <'      }\n'> <'      exists $x->{$_} or die "invalid JSON index";\n'> <'      $x = $x->{$_};\n'> 
                  <'    }\n'> <'    print $j->encode($x), "\\n";\n'> <'  '>
                )
              } {(DQ ($ VSub_At '$@'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: json-raw
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {
                (SQ <'\n'> <'    local $/; my $s = <STDIN> || exit 1;\n'> 
                  <'    my $j = JSON::PP->new->allow_nonref;\n'> <'    sub flat {\n'> <'      my $x = shift;\n'> <'      if (ref($x) eq "ARRAY") {\n'> 
                  <'        flat($_) foreach @$x;\n'> <'      } elsif (ref($x) eq "HASH") {\n'> <'        flat($_) foreach values %$x;\n'> 
                  <'      } else {\n'> <'        print $x, "\\n";\n'> <'      }\n'> <'    }\n'> <'    flat $j->decode($s);\n'> <'  '>
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: json-raw-nonnull
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:x) op:Equal)]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:x)
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: (command.CommandList children:[(C {(cat)})])
                        left_token: <Left_CommandSub '$('>
                      )
                    }
                )
              ]
            )
            (command.Case
              to_match: {($ VSub_DollarName '$x')}
              arms: [
                (case_arm pat_list:[{(null)}] action:[(C {(false)})])
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (command.SimpleCommand
                      words: [{(json-raw)}]
                      redirects: [
                        (redir.Redir
                          op: <Redir_TLess '<<<'>
                          fd: 16777215
                          arg_word: {(DQ ($ VSub_DollarName '$x'))}
                        )
                      ]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.FuncDef
      name: json-get-raw
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(json-get)} {(DQ ($ VSub_At '$@'))}) (C {(json-raw)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: json-get-raw-nonnull
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(json-get)} {(DQ ($ VSub_At '$@'))}) (C {(json-raw-nonnull)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: decode-base64
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-MMIME) (Lit_Other ':') (Lit_Other ':') (Base64)} {(-e)} 
              {(SQ <'print decode_base64(<STDIN>)'>)}
            )
          ]
        )
    )
    (command.FuncDef
      name: hush
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.SimpleCommand
                  words: [{(DQ ($ VSub_At '$@'))}]
                  redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)})]
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-post
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_eq
                              left: {($ VSub_Pound '$#')}
                              right: {(2)}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(curl)} {(-sSL)} {(-H)} {(DQ ('Content-Type: application/json'))} {(--data-raw)} 
                      {(DQ ($ VSub_Number '$2'))} {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (DQ ($ VSub_Number '$1'))}
                    )
                  ]
                )
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_eq
                              left: {($ VSub_Pound '$#')}
                              right: {(1)}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(curl)} {(-sSL)} {(-XPOST)} 
                      {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (DQ ($ VSub_Number '$1'))}
                    )
                  ]
                )
              ]
              else_action: [(C {(die)} {(127)} {(internal)} {(error)})]
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-new-session
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:capabilities) op:Equal)]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolUnary
                              op_id: BoolUnary_n
                              child: {(DQ ($ VSub_DollarName '$WEBDRIVER_CAPABILITIES'))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:capabilities)
                          op: Equal
                          rhs: {(DQ ($ VSub_DollarName '$WEBDRIVER_CAPABILITIES'))}
                        )
                      ]
                    )
                  ]
                )
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolUnary
                              op_id: BoolUnary_n
                              child: {(DQ ($ VSub_DollarName '$WEBDRIVER_BROWSER'))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:capabilities)
                          op: Equal
                          rhs: 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [
                                        (C {(json-obj)} {(browserName)} 
                                          {
                                            (DQ 
                                              (word_part.CommandSubPart
                                                command_list: 
                                                  (command.CommandList
                                                    children: [
                                                      (C {(json-str)} 
                                                        {
                                                          (DQ 
                                                            ($ VSub_DollarName '$WEBDRIVER_BROWSER')
                                                          )
                                                        }
                                                      )
                                                    ]
                                                  )
                                                left_token: <Left_CommandSub '$('>
                                              )
                                            )
                                          }
                                        )
                                      ]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                        )
                      ]
                    )
                  ]
                )
              ]
              else_action: [
                (C {(die)} {(1)} {(DQ ('neither WEBDRIVER_CAPABILITIES nor WEBDRIVER_BROWSER set'))})
              ]
            )
            (command.Pipeline
              children: [
                (C {(wd-post)} {(/session)} 
                  {
                    (DQ 
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(json-obj)} {(desiredCapabilities)} 
                                {(DQ ($ VSub_DollarName '$capabilities'))}
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                      )
                    )
                  }
                )
                (C {(json-get-raw-nonnull)} {(sessionId)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-assert-session
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolUnary
                              op_id: BoolUnary_z
                              child: {(DQ ($ VSub_DollarName '$WEBDRIVER_SESSION'))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(die)} {(1)} {(WEBDRIVER_SESSION)} {(not)} {(defined)})]
                )
              ]
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-session
      body: 
        (command.BraceGroup
          children: [
            (C {(wd-assert-session)})
            (C {(curl)} {(-sSL)} 
              {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (/session/) 
                (DQ ($ VSub_DollarName '$WEBDRIVER_SESSION')) (DQ ($ VSub_Number '$1'))
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-checked-result
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:result) op:Equal)]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result)
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: (command.CommandList children:[(C {(cat)})])
                        left_token: <Left_CommandSub '$('>
                      )
                    }
                )
              ]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:status)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (word_part.CommandSubPart
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.SimpleCommand
                                  words: [{(json-get)} {(status)}]
                                  redirects: [
                                    (redir.Redir
                                      op: <Redir_TLess '<<<'>
                                      fd: 16777215
                                      arg_word: {(DQ ($ VSub_DollarName '$result'))}
                                    )
                                  ]
                                )
                              ]
                            )
                          left_token: <Left_CommandSub '$('>
                        )
                      )
                    }
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_ne
                              left: {($ VSub_DollarName '$status')}
                              right: {(0)}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(die)} {(1)} 
                      {
                        (DQ 
                          (word_part.CommandSubPart
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.SimpleCommand
                                    words: [{(json-get-raw)} {(value)} {(message)}]
                                    redirects: [
                                      (redir.Redir
                                        op: <Redir_TLess '<<<'>
                                        fd: 16777215
                                        arg_word: {(DQ ($ VSub_DollarName '$result'))}
                                      )
                                    ]
                                  )
                                ]
                              )
                            left_token: <Left_CommandSub '$('>
                          )
                        )
                      }
                    )
                  ]
                )
              ]
              else_action: [
                (command.SimpleCommand
                  words: [{(json-get)} {(value)}]
                  redirects: [
                    (redir.Redir
                      op: <Redir_TLess '<<<'>
                      fd: 16777215
                      arg_word: {(DQ ($ VSub_DollarName '$result'))}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-post-session-value
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wd-post-session)} {(DQ ($ VSub_At '$@'))}) (C {(wd-checked-result)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-session-simple
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [
                    (C {(wd-get-session)} {(DQ ($ VSub_At '$@'))})
                    (C {(json-get-raw-nonnull)} {(value)})
                  ]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-session-value
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wd-get-session)} {(DQ ($ VSub_At '$@'))}) (C {(wd-checked-result)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-session-value-raw
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [
                    (C {(wd-get-session-value)} {(DQ ($ VSub_At '$@'))})
                    (C {(json-raw-nonnull)})
                  ]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-element-value
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (C {(wd-get-session-value-raw)} 
                  {(/element/) (DQ ($ VSub_Number '$1')) (/) (DQ ($ VSub_Number '$2'))}
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-current-url
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-simple)} {(/url)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-title
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-simple)} {(/title)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-window-handle
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-simple)} {(/window)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-page-source
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wd-get-session-value)} {(/source)}) (C {(json-raw)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-delete-session
      body: 
        (command.BraceGroup
          children: [
            (C {(wd-assert-session)})
            (C {(curl)} {(-sSL)} {(-XDELETE)} 
              {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (/session/) 
                (DQ ($ VSub_DollarName '$WEBDRIVER_SESSION')) (DQ ($ VSub_Number '$1'))
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-post-session
      body: 
        (command.BraceGroup
          children: [
            (C {(wd-assert-session)})
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:url)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (command.Pipeline
              children: [
                (C {(wd-post)} 
                  {(/session/) (DQ ($ VSub_DollarName '$WEBDRIVER_SESSION')) 
                    (DQ ($ VSub_DollarName '$url'))
                  } {(DQ ($ VSub_At '$@'))}
                )
                (C {(wd-checked-result)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-go
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/url)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(url)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Number '$1'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-close-window
      body: (command.BraceGroup children:[(C {(hush)} {(wd-delete-session)} {(/window)})])
    )
    (command.FuncDef
      name: wd-switch-to-window
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/window)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(handle)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Number '$1'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-window-handles
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [(C {(wd-get-session)} {(/window/handles)}) (C {(json-get-raw)} {(value)})]
              negated: F
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-switch-to-frame
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:id) op:Equal)]
            )
            (command.Case
              to_match: {($ VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [{(Lit_Other '[') (0-9) (Lit_Other ']')}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:id)
                          op: Equal
                          rhs: {($ VSub_Number '$1')}
                        )
                      ]
                    )
                  ]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:id)
                          op: Equal
                          rhs: 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Number '$1'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                        )
                      ]
                    )
                  ]
                )
              ]
            )
            (C {(hush)} {(wd-post-session)} {(/frame)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [(C {(json-obj)} {(id)} {(DQ ($ VSub_DollarName '$id'))})]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-switch-to-top-level-frame
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(frame)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: (command.CommandList children:[(C {(json-obj)} {(id)} {(null)})])
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-window-size
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:result) op:Equal)]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result)
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(wd-get-session)} {(/window/size)})]
                          )
                        left_token: <Left_CommandSub '$('>
                      )
                    }
                )
              ]
            )
            (command.Pipeline
              children: [
                (C {(echo)} {(DQ ($ VSub_DollarName '$result'))})
                (C {(json-get-raw)} {(value)} {(width)})
              ]
              negated: F
            )
            (command.Pipeline
              children: [
                (C {(echo)} {(DQ ($ VSub_DollarName '$result'))})
                (C {(json-get-raw)} {(value)} {(height)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-set-window-size
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/window/size)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(width)} {(DQ ($ VSub_Number '$1'))} {(height)} 
                            {(DQ ($ VSub_Number '$2'))}
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-maximize
      body: (command.BraceGroup children:[(C {(hush)} {(wd-post-session)} {(/window/maximize)})])
    )
    (command.FuncDef
      name: wd-parse-strategy
      body: 
        (command.BraceGroup
          children: [
            (command.Case
              to_match: {($ VSub_Number '$1')}
              arms: [
                (case_arm pat_list:[{(id)}] action:[(C {(json-str)} {(DQ (id))})])
                (case_arm
                  pat_list: [{(name)}]
                  action: [(C {(json-str)} {(DQ (name))})]
                )
                (case_arm
                  pat_list: [{(class) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('class name'))})]
                )
                (case_arm
                  pat_list: [{(tag) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('tag name'))})]
                )
                (case_arm
                  pat_list: [{(css) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('css selector'))})]
                )
                (case_arm
                  pat_list: [{(link) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('link text'))})]
                )
                (case_arm
                  pat_list: [{(partial) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('partial link text'))})]
                )
                (case_arm
                  pat_list: [{(xpath) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(xpath)})]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (C {(die)} {(1)} {(unknown)} {(element)} {(location)} {(strategy) (Lit_Other ':')} 
                      {(DQ ($ VSub_Number '$1'))}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-general-element-find
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:path)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:strategy) op:Equal)]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:strategy)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (word_part.CommandSubPart
                          command_list: 
                            (command.CommandList
                              children: [(C {(wd-parse-strategy)} {(DQ ($ VSub_Number '$1'))})]
                            )
                          left_token: <Left_CommandSub '$('>
                        )
                      )
                    }
                )
              ]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {($ VSub_QMark '$?')}
                      right: {(0)}
                    )
                )
                (command.ControlFlow
                  token: <ControlFlow_Exit exit>
                  arg_word: {($ VSub_QMark '$?')}
                )
              ]
            )
            (C {(shift)})
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:value) op:Equal)]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:value)
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(json-str)} {(DQ ($ VSub_Star '$*'))})]
                          )
                        left_token: <Left_CommandSub '$('>
                      )
                    }
                )
              ]
            )
            (command.Pipeline
              children: [
                (C {(wd-post-session)} {(DQ ($ VSub_DollarName '$path'))} 
                  {
                    (DQ 
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(json-obj)} {(using)} {(DQ ($ VSub_DollarName '$strategy'))} {(value)} 
                                {(DQ ($ VSub_DollarName '$value'))}
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                      )
                    )
                  }
                )
                (C {(json-raw)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-find-element
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-general-element-find)} {(/element)} {(DQ ($ VSub_At '$@'))})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-find-elements
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-general-element-find)} {(/elements)} {(DQ ($ VSub_At '$@'))})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-find-element-from-element
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:element)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-general-element-find)} {(/element/) (DQ ($ VSub_DollarName '$element')) (/element)} 
              {(DQ ($ VSub_At '$@'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-find-elements-from-element
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:element)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-general-element-find)} 
              {(/element/) (DQ ($ VSub_DollarName '$element')) (/elements)} {(DQ ($ VSub_At '$@'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-element-attribute
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:x) op:Equal)]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:x)
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(wd-get-session-value-raw)} 
                                {(/element/) (DQ ($ VSub_Number '$1')) (/attribute/) 
                                  (DQ ($ VSub_Number '$2'))
                                }
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                      )
                    }
                )
              ]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {($ VSub_QMark '$?')}
                      right: {(0)}
                    )
                )
                (C {(die)} {(1)} {(DQ ('attribute not found'))})
              ]
            )
            (C {(echo)} {(DQ ($ VSub_DollarName '$x'))})
          ]
        )
    )
    (command.FuncDef
      name: wd-get-element-css-value
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:x) op:Equal)]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:x)
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(wd-get-session-value-raw)} 
                                {(/element/) (DQ ($ VSub_Number '$1')) (/css/) (DQ ($ VSub_Number '$2'))}
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                      )
                    }
                )
              ]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {($ VSub_QMark '$?')}
                      right: {(0)}
                    )
                )
                (C {(die)} {(1)} {(DQ ('CSS property not found'))})
              ]
            )
            (C {(echo)} {(DQ ($ VSub_DollarName '$x'))})
          ]
        )
    )
    (command.FuncDef
      name: wd-get-element-text
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(text)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-element-tag-name
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(name)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-is-element-enabled
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {(1)}
                      right: 
                        {
                          (word_part.CommandSubPart
                            command_list: 
                              (command.CommandList
                                children: [
                                  (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(enabled)})
                                ]
                              )
                            left_token: <Left_CommandSub '$('>
                          )
                        }
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-is-element-selected
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {(1)}
                      right: 
                        {
                          (word_part.CommandSubPart
                            command_list: 
                              (command.CommandList
                                children: [
                                  (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(selected)})
                                ]
                              )
                            left_token: <Left_CommandSub '$('>
                          )
                        }
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-element-simple-action
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} 
              {(/element/) (DQ ($ VSub_Number '$1')) (/) (DQ ($ VSub_Number '$2'))}
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-element-click
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-element-simple-action)} {(DQ ($ VSub_Number '$1'))} {(click)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-element-clear
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-element-simple-action)} {(DQ ($ VSub_Number '$1'))} {(clear)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-element-send-keys
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:element) op:Equal)]
            )
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:element)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-element-simple-action)} {(DQ ($ VSub_DollarName '$element'))} {(value)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(value)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Star '$*'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-execute-script-sync
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:script)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-post-session)} {(/execute/sync)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(script)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_DollarName '$script'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            } {(args)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-arr)} {(DQ ($ VSub_At '$@'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-execute-script-async
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:script)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                    )
                  ]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-post-session)} {(/execute/async)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(script)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_DollarName '$script'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            } {(args)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-arr)} {(DQ ($ VSub_At '$@'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-all-cookies
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-value)} {(/cookie)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-get-named-cookie
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-value)} {(/cookie/) (DQ ($ VSub_Number '$1'))})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-add-cookie
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/cookie)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(cookie)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-obj)} {(DQ ($ VSub_At '$@'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                  )
                )
              }
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-delete-cookie
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-delete-session)} {(/cookie/) (DQ ($ VSub_Number '$1'))})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-delete-cookies
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-delete-session)} {(/cookie)})
              terminator: <Op_Semi ';'>
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-take-screenshot
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(wd-get-session-value)} {(/screenshot)})
                (C {(json-raw)})
                (C {(decode-base64)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.FuncDef
      name: wd-take-element-screenshot
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(wd-get-session-value)} {(/element/) (DQ ($ VSub_Number '$1')) (/screenshot)})
                (C {(json-raw)})
                (C {(decode-base64)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.FuncDef
      name: print-help
      body: 
        (command.BraceGroup
          children: [
            (command.SimpleCommand
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: <Redir_DLess '<<'>
                  fd: 16777215
                  here_begin: {(SQ <.>)}
                  here_end_span_id: 3165
                  stdin_parts: [
                    ('# wd -- WebDriver command line tool\n')
                    ('\n')
                    ('`wd` is a simple tool for interacting with servers that implement the\n')
                    ('W3C WebDriver API.\n')
                    ('\n')
                    ('It can be used for web automation tasks such as testing and scraping.\n')
                    ('\n')
                    ('You can use [Selenium](http://www.seleniumhq.org/) as the WebDriver server\n')
                    ('to control browsers on your own machine.\n')
                    ('\n')
                    ('There are commercial services that offer the WebDriver API remotely; see\n')
                    ('"Functional Test Services" [here](http://www.seleniumhq.org/ecosystem/).\n')
                    ('\n')
                    (
'See [the WebDriver spec](https://w3c.github.io/webdriver/webdriver-spec.html)\n'
                    )
                    ('for details about the protocol and behavior.\n')
                    ('\n')
                    ('## Dependencies\n')
                    ('\n')
                    ('  - `bash`\n')
                    ('  - `perl` (5.14 or greater)\n')
                    ('  - `curl`\n')
                    ('\n')
                    ('## Example session\n')
                    ('\n')
                    ('    $ export WEBDRIVER_BROWSER=chrome\n')
                    ('    $ export WEBDRIVER_SESSION="$(wd new-session)"\n')
                    ('    $ wd go https://github.com/mbrock/wd\n')
                    ('    $ wd screenshot > /tmp/wd.png\n')
                    ('    $ wd click "$(wd find css .user-mention)"\n')
                    ("    $ wd exec 'return document.title'\n")
                    ('\n')
                    ('## Configuration\n')
                    ('\n')
                    (
'  - `WEBDRIVER_URL`: WebDriver API URL (default `http://127.0.0.1:4444/wd/hub`)\n'
                    )
                    ('\n')
                    ('## Command reference\n')
                    ('\n')
                    ('### Managing sessions\n')
                    ('\n')
                    ('#### `wd new-session`\n')
                    ('\n')
                    ('Prints the new session ID.\n')
                    ('\n')
                    ('All other commands expect this ID to be in `WEBDRIVER_SESSION`, so\n')
                    ('\n')
                    ('    export WEBDRIVER_SESSION="$(wd new-session)"\n')
                    ('\n')
                    ('is a useful pattern.\n')
                    ('\n')
                    ('You must configure desired capabilities by setting either\n')
                    ('\n')
                    ('  - `WEBDRIVER_CAPABILITIES` to a stringified JSON object, or\n')
                    ('  - `WEBDRIVER_BROWSER` to a browser name (`chrome`, `firefox`, etc).\n')
                    ('\n')
                    ('#### `wd delete-session`\n')
                    ('\n')
                    ('Deletes the current session.\n')
                    ('\n')
                    ('### Navigation\n')
                    ('\n')
                    ('#### `wd go <url>`\n')
                    ('\n')
                    ('Opens `<url>` in the current window.\n')
                    ('\n')
                    ('#### `wd back`\n')
                    ('\n')
                    ('Navigates back in the current window.\n')
                    ('\n')
                    ('#### `wd forward`\n')
                    ('\n')
                    ('Navigates forward in the current window.\n')
                    ('\n')
                    ('#### `wd refresh`\n')
                    ('\n')
                    ('Refreshes the page of the current window.\n')
                    ('\n')
                    ('### Element finding\n')
                    ('\n')
                    ('#### `wd find <strategy> <selector> ...`\n')
                    ('\n')
                    ('Finds one matching element and prints its element ID.\n')
                    ('\n')
                    ('The `<strategy>` can be one of:\n')
                    ('\n')
                    ('  - `css` (CSS selector)\n')
                    ('  - `xpath` (XPath selector)\n')
                    ('  - `id` (element ID)\n')
                    ('  - `name` (element name)\n')
                    ('  - `class` (element class name)\n')
                    ('  - `tag` (element tag name)\n')
                    ('  - `link` (element link text)\n')
                    ('  - `partial` (partial element link text)\n')
                    ('\n')
                    ('The `<selector>` values are concatenated for convenience.\n')
                    ('\n')
                    ('Example:\n')
                    ('\n')
                    ('    $ wd find css article header img.avatar\n')
                    ('\n')
                    ('#### `wd find-all <strategy> <selector> ...`\n')
                    ('\n')
                    ('See `wd find`; finds all matching elements.\n')
                    ('\n')
                    ('#### `wd find-in <element-id> <strategy> <selector> ...`\n')
                    ('\n')
                    ('See `wd find`; finds one matching sub-element.\n')
                    ('\n')
                    ('#### `wd find-all-in <element-id> <strategy> <selector> ...`\n')
                    ('\n')
                    ('See `wd find`; finds all matching sub-elements.\n')
                    ('\n')
                    ('### Element information\n')
                    ('\n')
                    ('#### `wd is-selected <element-id>`\n')
                    ('\n')
                    ('Exits with a non-zero status if the element is not a selected or\n')
                    ('checked `input` or `option`.\n')
                    ('\n')
                    ('#### `wd is-enabled <element-id>`\n')
                    ('\n')
                    ('Exits with a non-zero status if the element is not an enabled\n')
                    ('form control.\n')
                    ('\n')
                    ('#### `wd attribute <element-id> <attribute-name>`\n')
                    ('\n')
                    ('Prints an element attribute value.\n')
                    ('\n')
                    ('Exits with non-zero status if the given attribute does not exist.\n')
                    ('\n')
                    ('#### `wd css-value <element-id> <css-property-name>`\n')
                    ('\n')
                    ('Prints an element CSS property value.\n')
                    ('\n')
                    ('Exits with non-zero status if the given style property does not exist.\n')
                    ('\n')
                    ('#### `wd text <element-id>`\n')
                    ('\n')
                    ("Prints an element's `innerText`.\n")
                    ('\n')
                    ('#### `wd tag-name <element-id>`\n')
                    ('\n')
                    ('Prints the tag name of an element.\n')
                    ('\n')
                    ('### Element actions\n')
                    ('\n')
                    ('#### `wd click <element-id>`\n')
                    ('\n')
                    ('Clicks an element.\n')
                    ('\n')
                    ('#### `wd clear <element-id>`\n')
                    ('\n')
                    ('Clears the value, checkedness, or text content of an element.\n')
                    ('\n')
                    ('#### `wd send-keys <element-id> [keys] ...`\n')
                    ('\n')
                    ('Sends keys to an element.\n')
                    ('\n')
                    ('Key arguments are concatenated for convenience.\n')
                    ('\n')
                    ('Example:\n')
                    ('\n')
                    ('    $ wd send-keys "$(wd find id search)" webdriver json api\n')
                    ('\n')
                    ('### JavaScript execution\n')
                    ('\n')
                    ('#### `wd execute <body> [argument] ...`\n')
                    ('\n')
                    ('Evaluates the JavaScript code `<body>` as a function called with the\n')
                    ('given arguments.\n')
                    ('\n')
                    ('Prints the return value of the specified function.\n')
                    ('\n')
                    ('#### `wd execute-async <body> [argument] ...`\n')
                    ('\n')
                    (
'Evaluates as in `wd execute` but waiting for the script to invoke a callback\n'
                    )
                    ('which is passed as an additional final argument to the specified function.\n')
                    ('\n')
                    ('Prints the value finally passed to the callback.\n')
                    ('\n')
                    ('### Page information\n')
                    ('\n')
                    ('#### `wd get-current-url`\n')
                    ('\n')
                    ('Prints the URL of the page in the current window.\n')
                    ('\n')
                    ('#### `wd get-title`\n')
                    ('\n')
                    ('Prints the title of the page in the current window.\n')
                    ('\n')
                    ('#### `wd get-page-source`\n')
                    ('\n')
                    ('Prints the raw HTML source of the page in the current window.\n')
                    ('\n')
                    ('### Windows\n')
                    ('\n')
                    ('#### `wd get-window-size`\n')
                    ('\n')
                    ("Prints the current window's width and height on separate lines.\n")
                    ('\n')
                    ('#### `wd set-window-size <width> <height>`\n')
                    ('\n')
                    ('Changes the size of the current window.\n')
                    ('\n')
                    ('#### `wd maximize`\n')
                    ('\n')
                    ('Maximizes the current window.\n')
                    ('\n')
                    ('#### `wd get-window-handle`\n')
                    ('\n')
                    ('Prints the window handle of the current window.\n')
                    ('\n')
                    ('#### `wd get-window-handles`\n')
                    ('\n')
                    ('Prints a list of all window handles in the current session.\n')
                    ('\n')
                    ('#### `wd switch-to-window <window-handle>`\n')
                    ('\n')
                    ('Changes which window is the current window.\n')
                    ('\n')
                    ('### Frames\n')
                    ('\n')
                    ('#### `wd switch-to-frame <frame-id>`\n')
                    ('\n')
                    ('Changes the current frame.\n')
                    ('\n')
                    ('`<frame-id>` can be either a number or an element ID.\n')
                    ('\n')
                    ('See [the specification](https://www.w3.org/TR/webdriver/#switch-to-frame)\n')
                    ('for exact details.\n')
                    ('\n')
                    ('#### `wd switch-to-top-level-frame`\n')
                    ('\n')
                    ('Resets the current frame to the top level.\n')
                    ('\n')
                    ('#### `wd switch-to-parent-frame`\n')
                    ('\n')
                    ('Sets the current frame to the parent of the current frame.\n')
                    ('\n')
                    ('### Cookies\n')
                    ('\n')
                    (
'See [the spec](https://w3c.github.io/webdriver/webdriver-spec.html#cookies)\n'
                    )
                    ('for details on cookie JSON serialization.\n')
                    ('\n')
                    ('#### `wd cookies`\n')
                    ('\n')
                    ('Prints the currently set cookies as a JSON array.\n')
                    ('\n')
                    ('#### `wd cookie <name>`\n')
                    ('\n')
                    ('Prints the cookie named `<name>` as JSON.\n')
                    ('\n')
                    ('#### `wd add-cookie <key> <value> <key> <value> ...`\n')
                    ('\n')
                    ('Adds a cookie according to the given keys/values.\n')
                    ('\n')
                    ('Example: `wd add-cookie name \'"user"\' value \'"mbrock"\'`\n')
                    ('\n')
                    ('#### `wd delete-cookie <name>`\n')
                    ('\n')
                    ('Deletes the cookie whose name is `<name>`.\n')
                    ('\n')
                    ('#### `wd delete-cookies`\n')
                    ('\n')
                    ('Deletes all cookies.\n')
                    ('\n')
                    ('### Screenshots\n')
                    ('\n')
                    ('#### `wd screenshot`\n')
                    ('\n')
                    ('Prints a binary PNG screenshot to stdout.\n')
                    ('\n')
                    ('#### `wd element-screenshot <element-id>`\n')
                    ('\n')
                    ('Prints a binary PNG screenshot of a specific element to stdout.\n')
                    ('\n')
                    ('(Not supported by Chrome.)\n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (C {(main)} {(DQ ($ VSub_At '$@'))})
  ]
)