2017-05-23 3 views
1

コンテキスト・メニューが表示されるように、Webサイトのメニュー・オプションにマウスを移動する必要があります。そこで私は、Actions-Classを使用して、Pagefactory-Model-SeleniumプロジェクトのPagefactoryで専用スクリプトを使用してJavaScriptExecutorを使用しました。しかし、POMで例外をスローするのはどちらも分かりませんが、POM以外のSeleniumプロジェクトには例外はありません。私は2つの簡単な例を提供したので、あなた自身の行動を比較することができます。C#を使用したSelenium Page Object Modelではマウス・ホバーは使用できません

以下

それは動作しますが、POMなしバージョンです:

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using OpenQA.Selenium.Support.Events; 
using OpenQA.Selenium.Remote; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Interactions; 

namespace UnitTestProject1 
{ 
[TestClass] 
public class SimpleTest 
{ 
    public static EventFiringWebDriver Driver { get; set; } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     var caps = new DesiredCapabilities(); 
     caps.SetCapability("browserName", "internet explorer"); 
     SimpleTest.Driver = new EventFiringWebDriver(new RemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), caps, TimeSpan.FromSeconds(120))); 
     SimpleTest.Driver.Navigate().GoToUrl("https://www.stackoverflow.com"); 
     var element = SimpleTest.Driver.FindElement(By.Id("nav-questions")); 

     // using Actions 
     // does not throw an exception 
     new Actions(SimpleTest.Driver).MoveToElement(element).Perform(); 

     // using JavaScript 
     // does not throw an exception 
     var mouseOverScript = @"if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj); } else if(document.createEventObject) { arguments[0].fireEvent('onmouseover'); }"; 
     ((IJavaScriptExecutor)SimpleTest.Driver).ExecuteScript(mouseOverScript, element); 
    } 

    [TestCleanup] 
    public void Cleanup() 
    { 
     SimpleTest.Driver.Quit(); 
    } 
} 
} 

そしてここでは、唯一の他のすべてが、他の例と同じであっても、例外をスローしPOM、とバージョンです。

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using OpenQA.Selenium.Support.Events; 
using OpenQA.Selenium.Remote; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Interactions; 
using OpenQA.Selenium.Support.PageObjects; 

namespace UnitTestProject1 
{ 
[TestClass] 
public class PomTest 
{ 
    public PomTest() 
    { 
     var caps = new DesiredCapabilities(); 
     caps.SetCapability("browserName", "chrome"); 
     PomTest.Driver = new EventFiringWebDriver(new RemoteWebDriver(new Uri("http://127.0.0.1:4444/wd/hub"), caps, TimeSpan.FromSeconds(120))); 
     PomTest.Driver.Navigate().GoToUrl("https://www.stackoverflow.com"); 
    } 

    public static EventFiringWebDriver Driver { get; set; } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     var page = new SoPage(); 
     page.HoverWithActions(); 
     page.HoverWithJS(); 
    } 

    [TestCleanup] 
    public void Cleanup() 
    { 
     PomTest.Driver.Quit(); 
    } 
} 

public class SoPage 
{ 
    public SoPage() 
    { 
     PageFactory.InitElements(PomTest.Driver, this); 
    } 

    public void HoverWithActions() 
    { 
     // using Actions 
     // throws System.Reflection.TargetException; 
     new Actions(PomTest.Driver).MoveToElement(this.Element).Perform(); 
    } 

    public void HoverWithJS() 
    { 
     // using JavaScript 
     // throws System.ArgumentException 
     var mouseOverScript = @"if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj); } else if(document.createEventObject) { arguments[0].fireEvent('onmouseover'); }"; 
     ((IJavaScriptExecutor)PomTest.Driver).ExecuteScript(mouseOverScript, this.Element); 
    } 

    [FindsBy(How = How.Id, Using = "nav-questions")] 
    public IWebElement Element { get; set; } 
} 
} 

例外がアクションのために、このです:

"System.Reflection.TargetException: Das Objekt stimmt mit dem Zieltyp nicht überein. 
    bei System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) 
    bei System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    bei OpenQA.Selenium.Support.PageObjects.WebDriverObjectProxy.InvokeMethod(IMethodCallMessage msg, Object representedValue) 
    bei OpenQA.Selenium.Support.PageObjects.WebElementProxy.Invoke(IMessage msg) 
    bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    bei OpenQA.Selenium.ILocatable.get_Coordinates() 
    bei OpenQA.Selenium.Interactions.Internal.MouseAction.get_ActionLocation() 
    bei OpenQA.Selenium.Interactions.MoveMouseAction.Perform() 
    bei OpenQA.Selenium.Interactions.CompositeAction.Perform() 
    bei OpenQA.Selenium.Interactions.Actions.Perform() 
    bei UnitTestProject1.SoPage.HoverWithActions() in c:\\users\\lwa\\documents\\visual studio 2015\\Projects\\UnitTestProject1\\UnitTestProject1\\PomTest.cs:Zeile 50. 
    bei UnitTestProject1.PomTest.TestMethod1() in c:\\users\\lwa\\documents\\visual studio 2015\\Projects\\UnitTestProject1\\UnitTestProject1\\PomTest.cs:Zeile 28." 

そして、このJavaScriのためにptExecutor:

System.ArgumentException: Argument is of an illegal typeOpenQA.Selenium.Support.Events.EventFiringWebDriver+EventFiringWebElement 
Parametername: arg 
    bei OpenQA.Selenium.Remote.RemoteWebDriver.ConvertObjectToJavaScriptObject(Object arg) 
    bei OpenQA.Selenium.Remote.RemoteWebDriver.ConvertArgumentsToJavaScriptObjects(Object[] args) 
    bei OpenQA.Selenium.Remote.RemoteWebDriver.ExecuteScriptCommand(String script, String commandName, Object[] args) 
    bei OpenQA.Selenium.Remote.RemoteWebDriver.ExecuteScript(String script, Object[] args) 
    bei OpenQA.Selenium.Support.Events.EventFiringWebDriver.ExecuteScript(String script, Object[] args) 
    bei UnitTestProject1.SoPage.HoverWithJS() in c:\\users\\lwa\\documents\\visual studio 2015\\Projects\\UnitTestProject1\\UnitTestProject1\\PomTest.cs:Zeile 58. 
    bei UnitTestProject1.PomTest.TestMethod1() in c:\\users\\lwa\\documents\\visual studio 2015\\Projects\\UnitTestProject1\\UnitTestProject1\\PomTest.cs:Zeile 29." 

私はパッケージでのVisual Studio 2015でのC#を使用していますSelenium.WebDriverとSelenium.Support両方のバージョン3.3には、(this questionを参照)3.4を使用してから私を妨げるバグがあります。私のSelenium Server Standaloneは3.4.0です。 Chrome、Firefox、Internet Explorerの動作は同じです。

C#でPOMプロジェクトでホバーリングを可能にする方法を知っている人はいますか?

+1

あなたはそれがスクリプト/アクションに渡されたときthis.Elementが正しく初期化されたこと、デバッグにチェックインすることはできますか? – FDM

+0

最初の例では、問題なしでデバッグの要素を見ることができますが、POMの例ではthis.Elementはデバッグ時に "このコンテキストでは透過プロキシのランタイムタイプを取得することはできません"というエラーを表示します。だから私はそれが正しく初期化されていないと思っている、どのように私はそれを変更するのですか? – Waldi

答えて

1

これには2つの回避策があります。あなたはどちらかできFindsByAttributeを破棄し、自分自身にあなたがIWebElementsのIListのを使用し、リストの最初の要素を参照することができIWebElementの

public IWebElement Element => PomTest.Driver.FindElement(By.Id("nav-questions")); 

またはその代わりをゲッタリングプロパティを定義し、このオプションのクレジットはthis questionに行きます。 これは私が使用していますバリアントになり、それは次のようになります。

public void HoverWithActions() 
{ 
    // using actions 
    // now it works :) 
    new Actions(PomTest.Driver).MoveToElement(this.Elements.First()).Perform(); 
} 

public void HoverWithJS() 
{ 
    // using Javascript 
    // now it works :) 
    var mouseOverScript = @"if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj); } else if(document.createEventObject) { arguments[0].fireEvent('onmouseover'); }"; 
    ((IJavaScriptExecutor)PomTest.Driver).ExecuteScript(mouseOverScript, this.Elements.First()); 
} 

[FindsBy(How = How.Id, Using = "nav-questions")] 
public IList<IWebElement> Elements { get; set; } 
関連する問題