2017-10-26 9 views
0

テキスト、テキストフィールド、標準フォームボタン、およびファイルアップロードボタン(ファイルアップロードダイアログを開く)の両方を持つページがあります。SeleniumとC#:ボタンでファイルアップロードダイアログを開くことができません

ファイルアップロードボタンを除いて、他のすべての要素にアクセスできます。私は.Click()とJavaScriptExecutorの両方で試しましたが、視覚的に見る限り、ファイルダイアログは決して開きません。しかし、エラーメッセージはありません。ボタンをクリックする

<a class="bttngrey file-input-container bttn-small" data-bind="enable: !uploading() " style="margin-top: 10px; ... data-original-title="Add attachment"> 
    <i class="fa fa-cloud-upload">...</i> 
    <input type="file" data-bind="upload: addAttachments, enable: !uploading()"> == $9 

C#/セレンコード:

ページのソース

NB:私はへの呼び出しを処理するために、ButtonクラスとJavaScriptActionsクラスを使用しています直接呼び出すのではなく、ChromeDriverのインスタンスです。コードスニペットが理にかなっていることを願っています。

Button.FindByXPath("/html/body/div[1]/div[2]/overlay--master/div/div/overlay-lightbox/div/div[3]/content-placeholder/a").Click(); 

JavaScriptActions.ButtonClickXPath("/html/body/div[1]/div[2]/overlay--master/div/div/overlay-lightbox/div/div[3]/content-placeholder/a"); 

public class Button { 
    public static IWebElement FindByXPath (string bttnxpath) { 
     return GCDriver.Instance.FindElement(By.XPath(bttnxpath)); 
    } 
} 

public class JavascriptActions { 
    public static void ButtonClickXPath (string xpath) { 
     GCDriver.JSClickXPath(xpath); 
    } 
} 

public class GCDriver { 
    .... 
    .... 
    .... 
    public static void JSClickXPath (string xpath) { 
     IWebElement icon = Instance.FindElement(By.XPath(xpath)); 
     Actions ob = new Actions(Instance); 
     ob.Click(icon); 
     IAction action = ob.Build(); 
     action.Perform(); 
    } 
    .... 
    .... 
    .... 
} 

ボタンをクリックする方法はありません。ページ上の他の「通常の」ボタンでも機能します。私がJavaScriptExecutorを試しているのは、このようなボタン(ファイルダイアログを開く)が通常のSeleniumメソッドではクリックできないケースが経験したことですが、JavaScriptExecutorを使用していました。

ここで奇妙なことは、どちらの方法もエラーなしで終了することです。しかし、私がページを見ているとき、私はダイアログのクリックとオープンを見ません。テストはただちに終了します。ボタンをクリックする前後に明示的に待機を追加することは役に立ちません。

アイデア?必要に応じてもっと詳しく説明します。質問/問題が明確になるためには、どの程度のコードを表示する必要があるかは必ずしも明確ではありません。

答えて

0

これを試してみてください。(ドライバー・クラスのインスタンスを使用して)

Actions actions = new Actions(Driver.Instance); 
actions.MoveToElement(Driver.Instance.FindElement(By.XPath(xpath))); 
actions.Click(); 
actions.Build().Perform(); 

だけでドライバクラスのメソッドを作成し、コード内の該当する場所からそれを呼び出します。

SendKeysを使用してファイルパスを送信することは可能ですが、通常はブラウザ/ Web要素ではないため、AutoItライブラリを使用してウィンドウ上のアクションを処理します。

+0

それは魅力のように機能します!ありがとう:-) –

1

私のプロジェクトで同様のコードを使用して、コードトライの下に記入してください:

IWebElement要素は=新しいWebDriverWait(_browserWindow、TimeSpan.FromSeconds(20))(ExpectedConditions.ElementToBeClickable(By.CssSelector(「[クラスまで。 = 'fa fa-cloud-upload'] ")));

//は

element.SendKeys( "ファイルパス")、それを添付し、完全なファイルパスを送ります。

また、投稿されたHTMLコードごとに、アップロードボタンには複合クラス名が含まれています。だから、これは複合クラス要素ロケータのために参照してください。 Compound class names are not supported. Consider searching for one class name and filtering the results

+0

ありがとうございました。上記のコードは、このエラーを返します:System.InvalidOperationException:不明なエラー:要素をフォーカスすることができません –

+0

上記のエラーについては、これらを参照してください:https://stackoverflow.com/questions/34537344/getting-cannot-focus-element-in-chrome- and-edge-using-java-selenium –

関連する問題