UI TA:selenium webdriver+junitマウスサスペンション、別の要素が現れ、この要素の解決方法をクリック
苦労の末、UI TA(test automation)のこの難題を解決したので、記録しなければならない.
前提は、テストが必要なこのページはgoogleのangularjsで書かれています.多くのページ効果はangularjsが持参したいくつかのイベントとcss hoverを組み合わせて実現されます.テストしたUITAフレームワークはselenium webdriver+junitです.
問題は、ページに効果があります.ボタンAをクリックすると、プロジェクトのリストBが表示され、任意のプロジェクトにマウスを置くと、このプロジェクトのすべてのdatasourceのリストが表示されます.いずれかのdatasourceをクリックすると、このdatasourceのデータを検索できます.私は今、この操作をシミュレートし、以下の試みをしました.
試行1:seleniumのActionsクラスのmoveToElement(webElement)メソッドを使用してマウスのサスペンションをシミュレートします.約10回のうち1回が指定したdatasourceに成功した.成功しなかったときの効果は、マウスがプロジェクトをぶらぶらしているようにdatasourceリストが何度も現れますが、クリックできません.マウスが選択したwebElementの境界に浮上した可能性があるため、効果が不安定になった可能性があるので、マウスmove toで指定したoffsetを試して、要素の中間地帯を確保したが、役に立たなかった.インターネットでactionのmoveToElementはマウスが点滅したという人がいることがわかりました.このコードが実行されると、マウスは要素の上にありません.jqueryのmouseover()を使用することをお勧めします.マウスは要素の上にあります.コード:
試行2:jqueryのmouseover()を利用してマウスのサスペンションをシミュレートします.長い間試してみたが、サスペンションの効果は現れなかった.テストページのこの要素にはjsでmouseover()をバインドするイベントがないため、テストコードのmouseover()も機能しないことが分かった.
试み3:一部のselenium APIのドキュメントはmouseover()があると言って、私は探して探して探して、selenium 1はmouseover()があることを発见して、selenium 2はなくて、その上selenium 1とselenium 2 driverの有効化の方式はまったく异なって、selenium 1を埋め込むのはあまりよくありません.
試行4:WebDriverのclick()が非表示の要素に対して有効かどうか.やってみたが、結論はだめだ.
試行5:Javascriptのclick()が非表示の要素に有効かどうか.やってみたが、結論は:いいです.これにより、問題は解決され、マウスをスキップしてプロジェクトを停止する手順をスキップし、datasourceを直接クリックすればよい.添付コード:
まとめてみると、この問題を解決するのに多くの時間がかかったのは、javascript、jquery、angularjsに詳しくないので、視野が狭く、どのような方法で解決できるか分からないので、開発のポイントで試行錯誤するしかありません.
前提は、テストが必要なこのページはgoogleのangularjsで書かれています.多くのページ効果はangularjsが持参したいくつかのイベントとcss hoverを組み合わせて実現されます.テストしたUITAフレームワークはselenium webdriver+junitです.
問題は、ページに効果があります.ボタンAをクリックすると、プロジェクトのリストBが表示され、任意のプロジェクトにマウスを置くと、このプロジェクトのすべてのdatasourceのリストが表示されます.いずれかのdatasourceをクリックすると、このdatasourceのデータを検索できます.私は今、この操作をシミュレートし、以下の試みをしました.
試行1:seleniumのActionsクラスのmoveToElement(webElement)メソッドを使用してマウスのサスペンションをシミュレートします.約10回のうち1回が指定したdatasourceに成功した.成功しなかったときの効果は、マウスがプロジェクトをぶらぶらしているようにdatasourceリストが何度も現れますが、クリックできません.マウスが選択したwebElementの境界に浮上した可能性があるため、効果が不安定になった可能性があるので、マウスmove toで指定したoffsetを試して、要素の中間地帯を確保したが、役に立たなかった.インターネットでactionのmoveToElementはマウスが点滅したという人がいることがわかりました.このコードが実行されると、マウスは要素の上にありません.jqueryのmouseover()を使用することをお勧めします.マウスは要素の上にあります.コード:
actions action = new Actions(driver);
action.moveToElement(projectElement).moveByOffset(10, 3).build().perform();
試行2:jqueryのmouseover()を利用してマウスのサスペンションをシミュレートします.長い間試してみたが、サスペンションの効果は現れなかった.テストページのこの要素にはjsでmouseover()をバインドするイベントがないため、テストコードのmouseover()も機能しないことが分かった.
JavascriptExecutor js = (JavascriptExecutor) driver;
String jsStr = "$('projectListDiv>ul>li>a:eq(" + i+ ")').mouseover()";
js.executeScript(jsStr);
试み3:一部のselenium APIのドキュメントはmouseover()があると言って、私は探して探して探して、selenium 1はmouseover()があることを発见して、selenium 2はなくて、その上selenium 1とselenium 2 driverの有効化の方式はまったく异なって、selenium 1を埋め込むのはあまりよくありません.
試行4:WebDriverのclick()が非表示の要素に対して有効かどうか.やってみたが、結論はだめだ.
試行5:Javascriptのclick()が非表示の要素に有効かどうか.やってみたが、結論は:いいです.これにより、問題は解決され、マウスをスキップしてプロジェクトを停止する手順をスキップし、datasourceを直接クリックすればよい.添付コード:
public static void searchInDatasourceOnSearchLogPage(WebDriver driver, String projectName, String datasourceName) {
SearchWebElement.getWebElementByXPath(driver, projectListXpath).click();
// project list
List<WebElement> projects = SearchWebElement.getWebElementListByXPath(
driver, projectsXpath);
List<WebElement> datasources = new ArrayList<WebElement>();
JavascriptExecutor js = (JavascriptExecutor) driver;
try {
for (WebElement projectElement : projects) {
System.out.println(projectElement.getText());
if (projectName.equals(projectElement.getText())) {
Actions action = new Actions(driver);
// moveToElement, datasource, datasource label text
// project , datasource list , text
action.moveToElement(projectElement).moveByOffset(10, 3)
.build().perform();
// datasource list
datasources = SearchWebElement.getWebElementListByXPath(driver, rawdataXpath);
for (int i=1;i<=datasources.size();i++) {
WebElement datasourceElement = datasources.get(i-1);
System.out.println(datasourceElement.getText());
if (datasourceName.equals(datasourceElement.getText())) {
// js click
String jsStr = "$('#projectListDiv>ul>li>ul>li>div:eq("+ i + ")').click();";
js.executeScript(jsStr);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
まとめてみると、この問題を解決するのに多くの時間がかかったのは、javascript、jquery、angularjsに詳しくないので、視野が狭く、どのような方法で解決できるか分からないので、開発のポイントで試行錯誤するしかありません.