質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

949閲覧

PythonでSeleniumを使用したChrome操作時に、「/」を含むXPATHの指定が上手くいきません。

wak

総合スコア2

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2022/12/29 08:23

前提

PythonでSeleniumを使用し、Chromeを操作する処理を組んでいます。
ブラウザの中に表示されているカレンダーから、選択した日付をクリックする処理です。

カレンダーの日付表記は、2日目以降は「2」「3」のように表示されていますが、
1日は「1/1」のように「月/日」のように表示されています。

発生している問題

Chrome上に下記の2つの要素があります。
※一部削除しています。

 <tbody><tr><td class="in_tbl"><font><b> 2 </b></font></td></tr>

 <tbody><tr><td class="in_tbl"><font><b> 1/1 </b></font></td></tr>

下記のように、XPATHを指定してクリックする処理を組んでいます。
「x = 2」の場合はクリックされますが、
「x = 1/1」の場合はクリックされません。

x = 2 driver.execute_script('arguments[0].click();', driver.find_element(By.XPATH, f"//*[tbody/tr[1]/td/font/b={x}]"))

「/」を含むとクリックできない事象について、原因と対処方法をご教授願います。

試したこと、エラーメッセージ

  • 「x = 1/1」を指定した場合のエラー
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[tbody/tr[1]/td/font/b=1.0]"}
  • 「x = "1/1"」を指定した場合のエラー
InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression //*[tbody/tr[1]/td/font/b=1/1] because of the following error: SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//*[tbody/tr[1]/td/font/b=1/1]' is not a valid XPath expression.
  • 「x = str(1/1)」を指定した場合のエラー
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[tbody/tr[1]/td/font/b=1.0]"}
  • 変数を使用せず、以下のように直接指定した場合のエラー
  • driver.execute_script('arguments[0].click();', driver.find_element(By.XPATH, "//*[tbody/tr[1]/td/font/b=1/1]"))
InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression //*[tbody/tr[1]/td/font/b=1/1] because of the following error: SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//*[tbody/tr[1]/td/font/b=1/1]' is not a valid XPath expression.
  • 2月のカレンダーを表示し、「x = 2/1」を指定した場合
エラーメッセージは表示されず、カレンダーの2日目がクリックされる。 該当箇所の要素は下記の通り <tbody><tr><td class="in_tbl"><font><b> 2 </b></font></td></tr>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

2は数値として扱われて=が成功しますが、1/1は数値じゃないので文字列として扱う必要があります。
XPath上で文字列とするために前後に引用符'付加します。
さらに、前後の空白を取り除いて比較した方が良いですね。取り除かずにx = " 1/1 "xの方に空白を入れても良いですが。

Python

1x = "1/1" 2driver.execute_script('arguments[0].click();', 3driver.find_element(By.XPATH, f"//*[normalize-space(tbody/tr[1]/td/font/b)='{x}']") 4)

投稿2022/12/29 09:51

otn

総合スコア84507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2022/12/29 09:58

テキストノードを数値と比較して、同じ数値なら = が真となるというのは知りませんでした。 文字列比較しかしたこと無かったです。
wak

2022/12/29 10:59

原因と対象方法をご教授いただきありがとうございます。 なるほど、前後の空白も検索対象に含めないといけなかったのですね。 ご提示いただいたコードのコピペで、正しくクリックすることができました。 わかりやすくご説明いただき、ありがとうございました。
guest

0

ベストアンサー

検索対象の文字列を""で囲った上、XPATHのtextを使ってタグ内の文字列にマッチさせるのはどうでしょうか?

//tbody/tr/td/font/b[text() = " 1/1 "]

空白などを無視して部分文字列一致で良いのであれば、containsも利用できるように思います。

//tbody/tr[1]/td/font/b[contains(text(), "1/1")]

投稿2022/12/29 09:27

knuser

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wak

2022/12/29 10:58 編集

ご回答ありがとうございます。 ご提示いただいた2通りで以下のように記述し、正しくクリックできました。 driver.execute_script('arguments[0].click();', driver.find_element(By.XPATH, '//tbody/tr[1]/td/font/b[text() = " 1/1 "]')) driver.execute_script('arguments[0].click();', driver.find_element(By.XPATH, '//tbody/tr[1]/td/font/b[contains(text(), "1/1")]')) また、応用で変数を使用した場合も上手くいきました。 x = 1/1 driver.execute_script('arguments[0].click();', driver.find_element(By.XPATH, f'//tbody/tr[1]/td/font/b[contains(text(), {x})]')) 早急にご回答いただき、ありがとうございました。
otn

2022/12/30 08:46

> x = 1/1 だと、x には 1÷1 の 1 が代入されますよ。
wak

2023/01/01 10:53

なるほど、よく考えたらそうですね。 これでマッチしたのは、「1/1」の中の「1」が部分一致していたからなんですね。 ご教授いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問