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()を使用することをお勧めします.マウスは要素の上にあります.コード:
		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に詳しくないので、視野が狭く、どのような方法で解決できるか分からないので、開発のポイントで試行錯誤するしかありません.