Atata를 사용하여 사용자 정의 웹 양식에 대한 UI 테스트 만들기
문제.
패크 소프트웨어 회사에서, 우리의 채팅 소프트웨어는 고객이 채팅 전 조사에 표시하고자 하는 모든 입력을 만들 수 있도록 하고, 사용자가 채팅에 들어가기 전에 다음과 같이 물어볼 것이다.
이 필드들은 간단한 텍스트 입력, 비밀번호 필드, 선택 단추와 아래 목록을 포함한 모든 html 필드 유형이 될 수 있다.
고객을 위해 새 주제를 설정할 때, 핵심 채팅창에 업데이트와 수정이 있을 때, 레이아웃과 행동이 변하지 않기를 바랍니다.현재 수동 업그레이드 과정으로 QA 팀원들이 채팅창에서 실행해 오류가 있는지 확인한다.이 수동 과정은 좀 틀리기 쉽다.
드롭다운 목록에 어떤 필드가 설정되어 있든지 간에 자동화된 해결 방안을 만들고 싶습니다.
우리는 Atata를 사용하여 다른 자동화 UI 테스트를 하는데, 나는 그것을 사용해서 이 문제를 해결하려고 한다.
아타타가 뭐예요?
Atata는 Selenium 기반의 자동화 테스트 프레임워크입니다.C# 코드를 사용하여 페이지를 클래스 파일로 정의한 다음 클라이언트의 모양을 걱정하지 않고 다양한 테스트를 간단하게 설정할 수 있습니다.
Yevgeniy Shunevych가 Atata를 이렇게 훌륭하게 해 주셔서 감사합니다. 그리고 끊임없이 업데이트와 개선을 진행하고 있습니다.
얘는 뭐 같아?
도전이 뭐예요?
Atata에는 내장된 '동적' 컨트롤러가 없습니다. 상호작용할 요소를 미리 정의해야 하기 때문에 이 문제를 해결하는 데 시간이 좀 걸립니다.
설정
나는 XUnit에서 Atata를 사용한다. 우리는 모든 단원 테스트에서 XUnit을 사용하기 때문에 Atata는 이 점을 완성해야 한다. 이것은 좀 어렵다. 왜냐하면 Atata는 원래의 XUnit 어댑터가 없지만, 약간의 추가 변경만 있으면 XUnit 로그와 통합할 수 있기 때문이다.
비밀 번호
너는 https://github.com/danieltallentire/AtataDynamicForms를 통해 코드를 얻을 수 있다
시도 1
우선, 나는 ControlList 클래스를 내장된 입력 컨트롤과 함께 사용하려고 한다.
using Atata;
namespace AtataDynamicFormTester
{
using _ = ChatStartPage;
[WaitForLoadingIndicator]
class ChatStartPage : Page<_>
{
[ControlDefinition(ContainingClass = "input-group")]
public ControlList<Input<string, _>, _> SurveyFields { get; private set; }
public Button<Chatting, _> StartChat { get; private set; }
public _ SetRandom()
{
foreach (var field in SurveyFields)
{
field.SetRandom();
}
return this;
}
}
}
표의 모든 컨트롤은 입력 그룹 클래스로 한div에 포장됩니다.이것은 모든 입력을 찾기 위해 목록 위치추적기와 함께 사용할 수 있다는 것을 의미한다.
이 일은 아주 빨리 해결되었다.제어 목록의 요소를 감지하고 찾을 수 있지만, 간단한 텍스트 필드가 있어도 값을 설정할 수 없습니다.
시도 2
나의 다음 시도는 간단한 사용자 정의 컨트롤러를 사용하여 입력 컨트롤러를 포장하는 것이다.Atata에서 사용자 정의 컨트롤은 상위 컨트롤에서 파생된 클래스입니다.
클래스를 포함하여 컨트롤 정의의 일부분으로 이동합니다.
우리는 이 요소의 존재에 의존할 수 있기 때문에 필드를 교체할 수 있다.
[ControlDefinition(ContainingClass = "input-group")]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
[FindByClass("form-control")]
public Input<string, TOwner> TextInput { get; set; }
public void SetRandom()
{
TextInput.SetRandom();
}
}
그런 다음 목록을 변경하여 참조합니다.
[ControlDefinition(ContainingClass = "input-group")]
public ControlList<DynamicControl<_>, _> SurveyFields { get; private set; }
성공!
좋아요.약간의 성공.이것은 이름과 회사 같은 간단한 필드에 매우 효과적이다.전자 우편 주소에 도착해서 무작위로 채우려고 할 때, 다른 컨트롤을 완전히 무시했다.
다음에 변경해야 할 사항은 입력 값을 기준으로 전환하는 것입니다.
public void SetRandom()
{
switch (Input.Attributes.Type)
{
case "text":
Input.SetRandom();
break;
case "email":
Input.Set(Atata.Randomizer.GetString("{0}@{0}.com"));
break;
case "date":
Input.Set("03/03/2021");
break;
case "checkbox":
Input.Set("true");
break;
default:
// ignore
break;
}
}
그래.점점 가까워진다. 전자 우편 주소와 날짜에 효과가 있다. 날짜를 문자열로 설정하는 것은 좀 서툴지만.
복선상자는 전혀 작동하지 않았고, select는 심지어 검출되지 않았다.
시도하다
다시 이런 종류를 보면 원소를 선택하는 것이 입력 원소가 아니라는 것을 잊어버렸다...읊다, 읊조리다
나는 게임을 하나 했는데 이 종류에 여러 요소를 추가할 수 있다는 것을 발견했다.
[FindByClass("form-control")]
public Input<string, TOwner> Input { get; set; }
[FindById("fld")]
[TermFindSettings(TargetAttributeType = typeof(FindByIdAttribute), Match = TermMatch.StartsWith)]
public CheckBox<TOwner> Checkbox { get; set; }
[FindByClass("form-control")]
public Select<TOwner> Select { get; set; }
컨트롤이 이 요소를 포함하지 않는 경우 오류가 발생하지 않지만, select 요소의 컨트롤 입력에 접근하려고 하면 이상이 발생합니다. (입력이 존재하지 않기 때문에 정확합니다.)
IsSafely 플래그가 설정된 Exists 속성을 확인하여 요소를 찾았는지 확인할 수 있는 체크를 만들 수 있습니다.
if (Checkbox.Exists(new SearchOptions() { IsSafely = true }))
이로 인해 속도가 느려져서 미리 정의된 시간 초과가 있는 마지막 코드를 찾았습니다.
[ControlDefinition(ContainingClass = "form-group")]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
[FindByClass("form-control", Timeout = 0.01)]
public Input<string, TOwner> Input { get; set; }
// checkboxes aren't wrapped by a nice form-control wrapper, so have to use a different search method
[FindById("fld", Timeout = 0.01)]
[TermFindSettings(TargetAttributeType = typeof(FindByIdAttribute), Match = TermMatch.StartsWith)]
public CheckBox<TOwner> Checkbox { get; set; }
[FindByXPath(".//*[contains(concat(' ', normalize-space(@class), ' '), ' form-control ')]/descendant-or-self::input[@type='date']", Timeout = 0.01)]
public DateInput<TOwner> DateInput { get; set; }
[FindByClass("form-control", Timeout = 0.01)]
public Select<TOwner> Select { get; set; }
public void SetRandom()
{
if (Checkbox.Exists(new SearchOptions() { IsSafely = true }))
{
Checkbox.Set(true);
}
else if(Select.Exists(new SearchOptions() { IsSafely = true }))
{
Select.Set(Select.Options[Atata.Randomizer.GetInt(0, Select.Options.Count - 1)].Value);
}
else if (DateInput.Exists(new SearchOptions() { IsSafely = true}))
{
DateInput.SetRandom();
}
else if (Input.Exists(new SearchOptions() { IsSafely = true }))
{
switch (Input.Attributes.Type)
{
case "text":
Input.SetRandom();
break;
case "email":
Input.Set(Atata.Randomizer.GetString("{0}@{0}.com"));
break;
default:
// ignore
break;
}
}
}
}
날짜 입력에 수동 XPath 검색을 사용해야 합니다. 기본적으로Atata는 날짜 입력이 마스크가 있는 일반 텍스트 입력이기 때문에 기본 텍스트 상자를 날짜 필드로 사용할 수 있습니다.
DateInput SetRandom에서 작업할 수 있도록 새 랜덤화기를 추가해야 합니다.
지금 나의 채팅창이 아주 잘 시작되었다.
이전 예시에서 포함된 클래스는 사실상 올바르지 않습니다. form 그룹으로 변경합니다. 복선상자가 입력 그룹div에 없기 때문입니다.
단지 내가 원하는 곳에서 화면 캡처를 사용합니다.
public void FillPrechatSurvey()
{
Go.To<ChatStartPage>(url: "http://localhost/newchat/chat.aspx?domain=www.parkersoftware.com")
.Report.Screenshot("Start Chat")
.SetRandom()
.Report.Screenshot("Filled Out")
.StartChat.ClickAndGo()
.Report.Screenshot("Chatting")
.Wait(5)
.CloseWindowButton.Click()
.Report.Screenshot("Finished");
}
결과:
다음은요?
DevOps에서 실행할 수 있도록 해상도와 URL을 환경 변수로 전달할 수 있도록 하기 위해서, 생산에 유리하도록 하기 위해서, 나는 작은 조정을 해야 한다.이것은 상당히 단도직입적이다.
장기적으로 볼 때, 나는 무작위로 발송된 데이터가 서버가 수신한 데이터인지 확인하기 위해 내장된 루트와 선택을 설정할 수 있기를 바란다.WhosOn Echo 로봇은 데이터를 반송할 수 있지만, 나는 SetRandom을 사용하여 출력을 어떤 방식으로 저장해야 한다.
업데이트
YevGeney는 대략적인 코드를 보다 깔끔하게 재구성하는 것을 권장합니다.
[ControlDefinition(ContainingClass = "form-group")]
[FindFirst(TargetAllChildren = true)]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
// checkboxes aren't wrapped by a nice form-control wrapper, so have to use a different search method
[FindById(TermMatch.StartsWith, "fld")]
public CheckBox<TOwner> Checkbox { get; set; }
public DateInput<TOwner> DateInput { get; set; }
public EmailInput<TOwner> EmailInput { get; set; }
public Select<TOwner> Select { get; set; }
public TextInput<TOwner> TextInput { get; set; }
public void SetRandom()
{
if (Checkbox.IsPresent)
{
Checkbox.Set(true);
}
else if(Select.IsPresent)
{
Select.Set(Select.Options[Atata.Randomizer.GetInt(0, Select.Options.Count - 1)].Value);
}
else if (EmailInput.IsPresent)
{
EmailInput.Set(Randomizer.GetString("{0}@{0}.com"));
}
else if (TextInput.IsPresent)
{
TextInput.SetRandom();
}
else if (DateInput.IsPresent)
{
DateInput.SetRandom();
}
}
}
IsPresent로 입력을 변경하는 것이 훨씬 간단합니다.
TargetAllChildren에 최상위 속성을 추가하면 클래스 이름이 필요하지 않습니다.
날짜 입력 대신 텍스트 입력을 사용하면 순서를 바꾸어 정렬을 잘하고 정확한 텍스트나 날짜 입력을 얻을 수 있습니다.
이 점을 실현하기 위해서, 나는 type='email'을 포획하기 위해 Email Input을 추가해야 한다
Reference
이 문제에 관하여(Atata를 사용하여 사용자 정의 웹 양식에 대한 UI 테스트 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/ctowestmidlands/using-atata-to-create-ui-tests-for-user-defined-web-forms-4jf0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Atata는 Selenium 기반의 자동화 테스트 프레임워크입니다.C# 코드를 사용하여 페이지를 클래스 파일로 정의한 다음 클라이언트의 모양을 걱정하지 않고 다양한 테스트를 간단하게 설정할 수 있습니다.
Yevgeniy Shunevych가 Atata를 이렇게 훌륭하게 해 주셔서 감사합니다. 그리고 끊임없이 업데이트와 개선을 진행하고 있습니다.
얘는 뭐 같아?
도전이 뭐예요?
Atata에는 내장된 '동적' 컨트롤러가 없습니다. 상호작용할 요소를 미리 정의해야 하기 때문에 이 문제를 해결하는 데 시간이 좀 걸립니다.
설정
나는 XUnit에서 Atata를 사용한다. 우리는 모든 단원 테스트에서 XUnit을 사용하기 때문에 Atata는 이 점을 완성해야 한다. 이것은 좀 어렵다. 왜냐하면 Atata는 원래의 XUnit 어댑터가 없지만, 약간의 추가 변경만 있으면 XUnit 로그와 통합할 수 있기 때문이다.
비밀 번호
너는 https://github.com/danieltallentire/AtataDynamicForms를 통해 코드를 얻을 수 있다
시도 1
우선, 나는 ControlList 클래스를 내장된 입력 컨트롤과 함께 사용하려고 한다.
using Atata;
namespace AtataDynamicFormTester
{
using _ = ChatStartPage;
[WaitForLoadingIndicator]
class ChatStartPage : Page<_>
{
[ControlDefinition(ContainingClass = "input-group")]
public ControlList<Input<string, _>, _> SurveyFields { get; private set; }
public Button<Chatting, _> StartChat { get; private set; }
public _ SetRandom()
{
foreach (var field in SurveyFields)
{
field.SetRandom();
}
return this;
}
}
}
표의 모든 컨트롤은 입력 그룹 클래스로 한div에 포장됩니다.이것은 모든 입력을 찾기 위해 목록 위치추적기와 함께 사용할 수 있다는 것을 의미한다.
이 일은 아주 빨리 해결되었다.제어 목록의 요소를 감지하고 찾을 수 있지만, 간단한 텍스트 필드가 있어도 값을 설정할 수 없습니다.
시도 2
나의 다음 시도는 간단한 사용자 정의 컨트롤러를 사용하여 입력 컨트롤러를 포장하는 것이다.Atata에서 사용자 정의 컨트롤은 상위 컨트롤에서 파생된 클래스입니다.
클래스를 포함하여 컨트롤 정의의 일부분으로 이동합니다.
우리는 이 요소의 존재에 의존할 수 있기 때문에 필드를 교체할 수 있다.
[ControlDefinition(ContainingClass = "input-group")]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
[FindByClass("form-control")]
public Input<string, TOwner> TextInput { get; set; }
public void SetRandom()
{
TextInput.SetRandom();
}
}
그런 다음 목록을 변경하여 참조합니다.
[ControlDefinition(ContainingClass = "input-group")]
public ControlList<DynamicControl<_>, _> SurveyFields { get; private set; }
성공!
좋아요.약간의 성공.이것은 이름과 회사 같은 간단한 필드에 매우 효과적이다.전자 우편 주소에 도착해서 무작위로 채우려고 할 때, 다른 컨트롤을 완전히 무시했다.
다음에 변경해야 할 사항은 입력 값을 기준으로 전환하는 것입니다.
public void SetRandom()
{
switch (Input.Attributes.Type)
{
case "text":
Input.SetRandom();
break;
case "email":
Input.Set(Atata.Randomizer.GetString("{0}@{0}.com"));
break;
case "date":
Input.Set("03/03/2021");
break;
case "checkbox":
Input.Set("true");
break;
default:
// ignore
break;
}
}
그래.점점 가까워진다. 전자 우편 주소와 날짜에 효과가 있다. 날짜를 문자열로 설정하는 것은 좀 서툴지만.
복선상자는 전혀 작동하지 않았고, select는 심지어 검출되지 않았다.
시도하다
다시 이런 종류를 보면 원소를 선택하는 것이 입력 원소가 아니라는 것을 잊어버렸다...읊다, 읊조리다
나는 게임을 하나 했는데 이 종류에 여러 요소를 추가할 수 있다는 것을 발견했다.
[FindByClass("form-control")]
public Input<string, TOwner> Input { get; set; }
[FindById("fld")]
[TermFindSettings(TargetAttributeType = typeof(FindByIdAttribute), Match = TermMatch.StartsWith)]
public CheckBox<TOwner> Checkbox { get; set; }
[FindByClass("form-control")]
public Select<TOwner> Select { get; set; }
컨트롤이 이 요소를 포함하지 않는 경우 오류가 발생하지 않지만, select 요소의 컨트롤 입력에 접근하려고 하면 이상이 발생합니다. (입력이 존재하지 않기 때문에 정확합니다.)
IsSafely 플래그가 설정된 Exists 속성을 확인하여 요소를 찾았는지 확인할 수 있는 체크를 만들 수 있습니다.
if (Checkbox.Exists(new SearchOptions() { IsSafely = true }))
이로 인해 속도가 느려져서 미리 정의된 시간 초과가 있는 마지막 코드를 찾았습니다.
[ControlDefinition(ContainingClass = "form-group")]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
[FindByClass("form-control", Timeout = 0.01)]
public Input<string, TOwner> Input { get; set; }
// checkboxes aren't wrapped by a nice form-control wrapper, so have to use a different search method
[FindById("fld", Timeout = 0.01)]
[TermFindSettings(TargetAttributeType = typeof(FindByIdAttribute), Match = TermMatch.StartsWith)]
public CheckBox<TOwner> Checkbox { get; set; }
[FindByXPath(".//*[contains(concat(' ', normalize-space(@class), ' '), ' form-control ')]/descendant-or-self::input[@type='date']", Timeout = 0.01)]
public DateInput<TOwner> DateInput { get; set; }
[FindByClass("form-control", Timeout = 0.01)]
public Select<TOwner> Select { get; set; }
public void SetRandom()
{
if (Checkbox.Exists(new SearchOptions() { IsSafely = true }))
{
Checkbox.Set(true);
}
else if(Select.Exists(new SearchOptions() { IsSafely = true }))
{
Select.Set(Select.Options[Atata.Randomizer.GetInt(0, Select.Options.Count - 1)].Value);
}
else if (DateInput.Exists(new SearchOptions() { IsSafely = true}))
{
DateInput.SetRandom();
}
else if (Input.Exists(new SearchOptions() { IsSafely = true }))
{
switch (Input.Attributes.Type)
{
case "text":
Input.SetRandom();
break;
case "email":
Input.Set(Atata.Randomizer.GetString("{0}@{0}.com"));
break;
default:
// ignore
break;
}
}
}
}
날짜 입력에 수동 XPath 검색을 사용해야 합니다. 기본적으로Atata는 날짜 입력이 마스크가 있는 일반 텍스트 입력이기 때문에 기본 텍스트 상자를 날짜 필드로 사용할 수 있습니다.
DateInput SetRandom에서 작업할 수 있도록 새 랜덤화기를 추가해야 합니다.
지금 나의 채팅창이 아주 잘 시작되었다.
이전 예시에서 포함된 클래스는 사실상 올바르지 않습니다. form 그룹으로 변경합니다. 복선상자가 입력 그룹div에 없기 때문입니다.
단지 내가 원하는 곳에서 화면 캡처를 사용합니다.
public void FillPrechatSurvey()
{
Go.To<ChatStartPage>(url: "http://localhost/newchat/chat.aspx?domain=www.parkersoftware.com")
.Report.Screenshot("Start Chat")
.SetRandom()
.Report.Screenshot("Filled Out")
.StartChat.ClickAndGo()
.Report.Screenshot("Chatting")
.Wait(5)
.CloseWindowButton.Click()
.Report.Screenshot("Finished");
}
결과:
다음은요?
DevOps에서 실행할 수 있도록 해상도와 URL을 환경 변수로 전달할 수 있도록 하기 위해서, 생산에 유리하도록 하기 위해서, 나는 작은 조정을 해야 한다.이것은 상당히 단도직입적이다.
장기적으로 볼 때, 나는 무작위로 발송된 데이터가 서버가 수신한 데이터인지 확인하기 위해 내장된 루트와 선택을 설정할 수 있기를 바란다.WhosOn Echo 로봇은 데이터를 반송할 수 있지만, 나는 SetRandom을 사용하여 출력을 어떤 방식으로 저장해야 한다.
업데이트
YevGeney는 대략적인 코드를 보다 깔끔하게 재구성하는 것을 권장합니다.
[ControlDefinition(ContainingClass = "form-group")]
[FindFirst(TargetAllChildren = true)]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
// checkboxes aren't wrapped by a nice form-control wrapper, so have to use a different search method
[FindById(TermMatch.StartsWith, "fld")]
public CheckBox<TOwner> Checkbox { get; set; }
public DateInput<TOwner> DateInput { get; set; }
public EmailInput<TOwner> EmailInput { get; set; }
public Select<TOwner> Select { get; set; }
public TextInput<TOwner> TextInput { get; set; }
public void SetRandom()
{
if (Checkbox.IsPresent)
{
Checkbox.Set(true);
}
else if(Select.IsPresent)
{
Select.Set(Select.Options[Atata.Randomizer.GetInt(0, Select.Options.Count - 1)].Value);
}
else if (EmailInput.IsPresent)
{
EmailInput.Set(Randomizer.GetString("{0}@{0}.com"));
}
else if (TextInput.IsPresent)
{
TextInput.SetRandom();
}
else if (DateInput.IsPresent)
{
DateInput.SetRandom();
}
}
}
IsPresent로 입력을 변경하는 것이 훨씬 간단합니다.
TargetAllChildren에 최상위 속성을 추가하면 클래스 이름이 필요하지 않습니다.
날짜 입력 대신 텍스트 입력을 사용하면 순서를 바꾸어 정렬을 잘하고 정확한 텍스트나 날짜 입력을 얻을 수 있습니다.
이 점을 실현하기 위해서, 나는 type='email'을 포획하기 위해 Email Input을 추가해야 한다
Reference
이 문제에 관하여(Atata를 사용하여 사용자 정의 웹 양식에 대한 UI 테스트 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/ctowestmidlands/using-atata-to-create-ui-tests-for-user-defined-web-forms-4jf0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using Atata;
namespace AtataDynamicFormTester
{
using _ = ChatStartPage;
[WaitForLoadingIndicator]
class ChatStartPage : Page<_>
{
[ControlDefinition(ContainingClass = "input-group")]
public ControlList<Input<string, _>, _> SurveyFields { get; private set; }
public Button<Chatting, _> StartChat { get; private set; }
public _ SetRandom()
{
foreach (var field in SurveyFields)
{
field.SetRandom();
}
return this;
}
}
}
[ControlDefinition(ContainingClass = "input-group")]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
[FindByClass("form-control")]
public Input<string, TOwner> TextInput { get; set; }
public void SetRandom()
{
TextInput.SetRandom();
}
}
[ControlDefinition(ContainingClass = "input-group")]
public ControlList<DynamicControl<_>, _> SurveyFields { get; private set; }
public void SetRandom()
{
switch (Input.Attributes.Type)
{
case "text":
Input.SetRandom();
break;
case "email":
Input.Set(Atata.Randomizer.GetString("{0}@{0}.com"));
break;
case "date":
Input.Set("03/03/2021");
break;
case "checkbox":
Input.Set("true");
break;
default:
// ignore
break;
}
}
[FindByClass("form-control")]
public Input<string, TOwner> Input { get; set; }
[FindById("fld")]
[TermFindSettings(TargetAttributeType = typeof(FindByIdAttribute), Match = TermMatch.StartsWith)]
public CheckBox<TOwner> Checkbox { get; set; }
[FindByClass("form-control")]
public Select<TOwner> Select { get; set; }
if (Checkbox.Exists(new SearchOptions() { IsSafely = true }))
[ControlDefinition(ContainingClass = "form-group")]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
[FindByClass("form-control", Timeout = 0.01)]
public Input<string, TOwner> Input { get; set; }
// checkboxes aren't wrapped by a nice form-control wrapper, so have to use a different search method
[FindById("fld", Timeout = 0.01)]
[TermFindSettings(TargetAttributeType = typeof(FindByIdAttribute), Match = TermMatch.StartsWith)]
public CheckBox<TOwner> Checkbox { get; set; }
[FindByXPath(".//*[contains(concat(' ', normalize-space(@class), ' '), ' form-control ')]/descendant-or-self::input[@type='date']", Timeout = 0.01)]
public DateInput<TOwner> DateInput { get; set; }
[FindByClass("form-control", Timeout = 0.01)]
public Select<TOwner> Select { get; set; }
public void SetRandom()
{
if (Checkbox.Exists(new SearchOptions() { IsSafely = true }))
{
Checkbox.Set(true);
}
else if(Select.Exists(new SearchOptions() { IsSafely = true }))
{
Select.Set(Select.Options[Atata.Randomizer.GetInt(0, Select.Options.Count - 1)].Value);
}
else if (DateInput.Exists(new SearchOptions() { IsSafely = true}))
{
DateInput.SetRandom();
}
else if (Input.Exists(new SearchOptions() { IsSafely = true }))
{
switch (Input.Attributes.Type)
{
case "text":
Input.SetRandom();
break;
case "email":
Input.Set(Atata.Randomizer.GetString("{0}@{0}.com"));
break;
default:
// ignore
break;
}
}
}
}
public void FillPrechatSurvey()
{
Go.To<ChatStartPage>(url: "http://localhost/newchat/chat.aspx?domain=www.parkersoftware.com")
.Report.Screenshot("Start Chat")
.SetRandom()
.Report.Screenshot("Filled Out")
.StartChat.ClickAndGo()
.Report.Screenshot("Chatting")
.Wait(5)
.CloseWindowButton.Click()
.Report.Screenshot("Finished");
}
DevOps에서 실행할 수 있도록 해상도와 URL을 환경 변수로 전달할 수 있도록 하기 위해서, 생산에 유리하도록 하기 위해서, 나는 작은 조정을 해야 한다.이것은 상당히 단도직입적이다.
장기적으로 볼 때, 나는 무작위로 발송된 데이터가 서버가 수신한 데이터인지 확인하기 위해 내장된 루트와 선택을 설정할 수 있기를 바란다.WhosOn Echo 로봇은 데이터를 반송할 수 있지만, 나는 SetRandom을 사용하여 출력을 어떤 방식으로 저장해야 한다.
업데이트
YevGeney는 대략적인 코드를 보다 깔끔하게 재구성하는 것을 권장합니다.
[ControlDefinition(ContainingClass = "form-group")]
[FindFirst(TargetAllChildren = true)]
class DynamicControl<TOwner> : Control<TOwner> where TOwner : PageObject<TOwner>
{
// checkboxes aren't wrapped by a nice form-control wrapper, so have to use a different search method
[FindById(TermMatch.StartsWith, "fld")]
public CheckBox<TOwner> Checkbox { get; set; }
public DateInput<TOwner> DateInput { get; set; }
public EmailInput<TOwner> EmailInput { get; set; }
public Select<TOwner> Select { get; set; }
public TextInput<TOwner> TextInput { get; set; }
public void SetRandom()
{
if (Checkbox.IsPresent)
{
Checkbox.Set(true);
}
else if(Select.IsPresent)
{
Select.Set(Select.Options[Atata.Randomizer.GetInt(0, Select.Options.Count - 1)].Value);
}
else if (EmailInput.IsPresent)
{
EmailInput.Set(Randomizer.GetString("{0}@{0}.com"));
}
else if (TextInput.IsPresent)
{
TextInput.SetRandom();
}
else if (DateInput.IsPresent)
{
DateInput.SetRandom();
}
}
}
IsPresent로 입력을 변경하는 것이 훨씬 간단합니다.TargetAllChildren에 최상위 속성을 추가하면 클래스 이름이 필요하지 않습니다.
날짜 입력 대신 텍스트 입력을 사용하면 순서를 바꾸어 정렬을 잘하고 정확한 텍스트나 날짜 입력을 얻을 수 있습니다.
이 점을 실현하기 위해서, 나는 type='email'을 포획하기 위해 Email Input을 추가해야 한다
Reference
이 문제에 관하여(Atata를 사용하여 사용자 정의 웹 양식에 대한 UI 테스트 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ctowestmidlands/using-atata-to-create-ui-tests-for-user-defined-web-forms-4jf0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)