seleniumを入れたらキーイベントがおかしくなりました。 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 ねろ  (社会人) 投稿日時 2022/8/19 12:34:43
魔界の仮面弁士様

重ねての回答ありがとうございます。
名前空間の影響の範囲大変勉強になりました。

確かに使い分けることでより無駄がなくなりそうです。

参考にさせていただきます!
ありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/8/19 12:21:28
> どなたか解決方法わかりますでしょうか?

ということで…先の回答にも書いたように、名前空間を明示すれば OK です。

If e.KeyCode = Keys.Enter Then
If e.KeyCode = System.Windows.Forms.Keys.Enter Then



あるいは、追加の Imports を書かずとも、System.Windows.Forms 側を優先したまま
Selenium のコードを書いていくことはできるでしょう。
'Dim driver As New ChromeDriver() 
Dim driver As New OpenQA.Selenium.Chrome.ChromeDriver()


あるいは、Selenium 側に任意のエイリアス(別名)を付けるという手もあります。
'長い名前空間に別名を付ける 
Imports Selenium = OpenQA.Selenium
Imports Chrome = OpenQA.Selenium.Chrome
'  (中略) 
Dim driver1 As New OpenQA.Selenium.Chrome.ChromeDriver()  'フルネーム 
Dim driver2 As New Chrome.ChromeDriver()  'エイリアス名前空間 



他にも競合しうる名前が出てくるかもしれませんが、その都度、
名前空間を明示した表現にすることを検討してみてください。
Dim a0 As ScreenOrientation
Dim a1 As System.Windows.Forms.ScreenOrientation
Dim a2 As OpenQA.Selenium.ScreenOrientation
投稿者 ねろ  (社会人) 投稿日時 2022/8/19 12:10:36
魔界の仮面弁士様

回答ありがとうございます。
とてもわかりやすく解説いただきありがとうございます。

If e.KeyCode = System.Windows.Forms.Keys.Enter Then

とすることで無事に解決できました。

勉強にもなり本当に助かりました。
ありがとうございました!
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/8/19 11:13:26
この問題は、
 If e.KeyCode = Keys.Enter Then
が、
 If e.KeyCode = System.Windows.Forms.Keys.Enter Then
 If e.KeyCode = OpenQA.Selenium.Keys.Enter Then
のいずれの意味で解釈されるのか…という話です。

どちらに解釈されるかは曖昧ですが、今回のケースでは、
System.Windows.Forms 名前空間は「プロジェクトのプロパティの参照タブ」で
プロジェクト全体に対してインポートされた物であるのに対し、
OpenQA.Selenium 名前空間は、Form1.vb ファイル限定のインポートなので
OpenQA.Selenium 側の方が優先度が高くなった結果生じた問題です。


e.KeyCode の型は System.Windows.Forms.Keys 列挙型なので、「数値」の一種です。
一方、OpenQA.Selenium.Keys.Enter は String 型であり、値は ChrW(&HE007) です。
https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/src/webdriver/Keys.cs#L65-L68

※ちなみに E007 は Unicode で定義されていない無効文字です。


If e.KeyCode = Keys.Enter Then
において、左辺は列挙値なので、「数値」の一種となり、
それを右辺の文字列と比較しようとしているものと解釈されています。

Option Strict On の場合は、コンパイルエラーとして
BC30512「Option Strict On では 'String' から 'Double' への暗黙的な変換は許可されていません。」
となるでしょう。

Option Strict Off の場合は、実際に実行された時に検出されて
「System.InvalidCastException: 'String "" から型 'Double' への変換は無効です。」
の例外が発生します。
投稿者 ねろ  (社会人) 投稿日時 2022/8/19 10:36:19
visual studio 2022にてWindowsアプリケーションの開発を行っています。
Selenium.WebDriverとSelenium.WebDriver.ChromeDriverを追加してスクレイピングを行っています。
seleniumは正常に動くのですが、テキストボックスでのキーイベントがおかしくなりました。
新しくシンプルなテスト用のアプリを作ったところ同じ現象がおきました。
下記がテスト用アプリのコードです
フォームにテキストボックスを1つ配置してSelenium.WebDriverとSelenium.WebDriver.ChromeDriverを追加しただけのものになります。

Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome

Public Class Form1
Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown

If e.KeyCode = Keys.Enter Then
MsgBox(TextBox1.Text)
End If
End Sub
End Class

上記のコードでTextBox1になにかしら文字を入力すると

If e.KeyCode = Keys.Enter Then

この部分で下記のエラーがでます

System.InvalidCastException
HResult=0x80004002
Message=Conversion from string "" to type 'Double' is not valid.
Source=Microsoft.VisualBasic.Core
スタック トレース:
場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat)
場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value)
場所 WinFormsApp2.Form1.TextBox1_KeyDown(Object sender, KeyEventArgs e) (C:\Users\*******\source\repos\WinFormsApp2\WinFormsApp2\Form1.vb):行 7
場所 System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)
場所 System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
場所 System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.TextBoxBase.WndProc(Message& m)
場所 System.Windows.Forms.TextBox.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, WM msg, IntPtr wparam, IntPtr lparam)

この例外は、最初にこの呼び出し履歴
[外部コード] でスローされました

内部例外 1:
FormatException: Input string was not in a correct format.


コードから

Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome

を削除やコメント化をすると正常に動きます。
どなたか解決方法わかりますでしょうか?