Цикл через Интерактивный установщик с использованием ожидаемого - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь автоматизировать ввод с экрана интерактивного установщика, используя ожидаемое, и хотел бы использовать цикл, который циклически перебирает строки файла ответов в качестве входных данных для части установщика.

Программа установки имеет несколько разделов, некоторые из которых легко обрабатываются простыми ответами «ожидаем / отправляем». Однако в установщике есть раздел, который повторяет запрос данных, пока вы не нажмете клавишу для завершения ввода. Затем остальная часть установщика продолжается.

Секция зацикливания выглядит на экране следующим образом:

-------------------------------------------------------------------------------------------
Please enter ID details:
Please select an option: [A]dd [D]elete [I]mport [E]xport [F]inish =>A

Path: /opt/scanner/REF1/dump 
ID: REF1


Please enter ID details:
Please select an option: [A]dd [D]elete [I]mport [E]xport [F]inish =>A

Path: /opt/scanner/REF2/dump 
ID: REF2

Please select an option: [A]dd [D]elete [I]mport [E]xport [F]inish =>F

Rest of installer....
-------------------------------------------------------------------------------------------

Часть моего ожидаемого сценария для вышеупомянутого выглядит следующим образом:

expect -exact "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"
send -- "A\r"

expect -exact "Path: "
send -- "/opt/scanner/REF1/dump"
expect -exact "/opt/scanner/REF1/dump"
send -- "\r"


expect -exact "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"
send -- "A\r"

expect -exact "Path: "
send -- "/opt/scanner/REF2/dump"
expect -exact "/opt/scanner/REF2/dump"
send -- "\r"

expect -exact "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"
send -- "F\r"

Пожалуйста, извините за многословие, поскольку я не использовал ожидание долго. Это работает, но не очень эффективно.

В идеале файл ответов содержит REF1, REF2 до EOF (по одному на строку) и цикл для чтения каждой строки и отправки на экран.

Я видел это решение , но не уверен, как это согласуется с вышеприведенным.

Я играл с этим кодом Tcl, который может сформировать решение?

puts "/opt/scanner/$LINE/dump"
puts "$LINE"

Где $ LINE - REF1, REF2 из файла ответов.

Заранее спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Первое, что нужно сделать, чтобы уменьшить многословие: поместить подсказку в переменную; отправить возврат каретки с путем.

set prompt "Please select an option: \[A\]dd \[D\]elete \[I\]mport \[E\]xport \[F\]inish =>"

expect -exact $prompt
send -- "A\r"
expect -exact "Path: "
send -- "/opt/scanner/REF1/dump\r"

expect -exact $prompt
send -- "A\r"
expect -exact "Path: "
send -- "/opt/scanner/REF2/dump\r"
send -- "\r"

expect -exact $prompt
send -- "F\r"

Мы могли бы поместить это в цикл, но это добавляет некоторую сложность

set refs [list "REF1" "REF2"]
set count 0
expect $prompt {
    if {$count == 2} {
        send -- "F\r"
    } else {
        send -- "A\r"
        expect -exact "Path: "
        set ref [lindex $refs $count]
        send -- "/opt/scanner/$ref/dump\r"
        incr count
        exp_continue
    }
}

Команда exp_continue возвращается к "внешней" команде ожидания.

...