java - 使用 Selenium 时,不提交明显选择的表单选项(手动测试时有效)
问题描述
我正在为具有报告选项的页面设置自动化测试。例如,用户可以选择他们想要包含在报告中的状态:
<select _ngcontent-c16="" class="multiSelect ng-valid ng-dirty ng-touched" formcontrolname="formVal" multiple="" name="Status"><!----><option _ngcontent-c16="" value="0: ''">Any Status</option><!----><!----><!----><option _ngcontent-c16="" value="1: 'draft'">Submission in Progress</option><option _ngcontent-c16="" value="2: 'submitted'">Ready for Decision</option><option _ngcontent-c16="" value="3: 'checklist'">Ready for Checklist</option><option _ngcontent-c16="" value="4: 'minorRevisions'">Waiting for Revisions (Minor)</option><option _ngcontent-c16="" value="5: 'majorRevisions'">Waiting for Revisions (Major)</option><option _ngcontent-c16="" value="6: 'accepted'">Ready for Delivery</option><option _ngcontent-c16="" value="7: 'pendingDelivery'">Delivery in Progress</option><option _ngcontent-c16="" value="8: 'delivered'">Delivered to ProQuest</option><option _ngcontent-c16="" value="9: 'withdrawn'">Withdrawn</option><option _ngcontent-c16="" value="10: 'published'">Published by ProQuest</option><option _ngcontent-c16="" value="11: 'rejected'">Rejected</option><option _ngcontent-c16="" value="12: 'committeeReview'">Committee Review</option><!----><!----><!----></select>
该测试旨在选择不同的选项,然后检查生成的报告以确保它仅包含指定的信息。我遇到了一个问题,表单选项似乎被明显选中,但实际上并没有被提交。正如您在下面看到的,我已经尝试过使用 Select 和通过 css 定位并单击(状态和上次事件):
commUtil.UnSelectOptionByText(LOC_STATUS_LISTBOX, "Any Status");
commUtil.UnSelectOptionByText(LOC_LASTEVENT_LISTBOX, "Any Last Event");
/*
selectOptionByText(LOC_STATUS_LISTBOX, status);
selectOptionByText(LOC_LASTEVENT_LISTBOX, lastEvent);
*/
getDriver().findElement(By.cssSelector(LOC_LASTEVENT_LISTBOX + " option[value*='" + lastEvent + "']")).click();
getDriver().findElement(By.cssSelector(LOC_STATUS_LISTBOX + " option[value*='" + status + "']")).click();
getDriver().findElement(By.cssSelector(LOC_FROM_SELECTOR)).sendKeys(from);
getDriver().findElement(By.cssSelector(LOC_TO_SELECTOR)).sendKeys(to);
setEmailTo(email);
click(LOC_RUNREPORT_BOTTOM_BTN, null);
当测试运行时,任何一种方法都可以明显看出一切都是正确的。问题是,无论选择什么选项实际上都没有被提交。
这是手动完成时的请求示例:
{siteId: 5, submissionStatus: ["withdrawn"], dateFrom: "2018-01-01", dateTo: "2019-09-01",…}
dateFrom: "2018-01-01"
dateTo: "2019-09-01"
deliveryMethod: "email"
emailTo: "validateRunReportAttachment@gmail.com"
reportFields: ["siteSubmId", "submissionStatus", "submitDate", "title", "keyword", "subjectCategory", "tag",…]
siteId: 5
submissionStatus: ["withdrawn"]
这是通过自动化完成时相同请求的示例:
{siteId: 5, dateFrom: "2018-01-01", dateTo: "2019-09-01",…}
dateFrom: "2018-01-01"
dateTo: "2019-09-01"
deliveryMethod: "email"
emailTo: "validateRunReportAttachment@gmail.com"
reportFields: ["siteSubmId", "submissionStatus", "submitDate", "title", "keyword", "subjectCategory", "tag",…]
siteId: 5
有没有人遇到过类似的事情?一般有什么建议吗?同样,手动运行报告时,我从来没有遇到过问题。
解决方案
你能试着通过Javascript点击下面的2个元素吗
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", getDriver().findElement(By.cssSelector(LOC_LASTEVENT_LISTBOX + " option[value*='" + lastEvent + "']")));
executor.executeScript("arguments[0].click();", getDriver().findElement(By.cssSelector(LOC_STATUS_LISTBOX + " option[value*='" + status + "']")));
推荐阅读
- django - Heroku:在没有本地数据库的情况下安装 Postgres | 姜戈
- php - 此路由不支持 GET 方法。支持的方法:POST。与 laravel
- swift - 如何确定枚举类型
- java - 如何在 ChannelHandlerContext netty 4.1.50 中存储值
- active-directory - Microsoft 文档 - “Win32 AD”和“Windows 协议 AD”有什么区别?
- c - 使用 struct 时 C 中的 for 循环出现问题
- excel - 使用字符串通过变量名控制 VBA 表单
- c - 如何将 Pcie 区域模拟为持久内存?
- cmake - 当依赖文件被修改时,如何让 CMake 重新运行 add_custom_command?
- sql-server - 从标志更改为新列时有效地提取列值