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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

selenium

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

Q&A

解決済

1回答

2742閲覧

TypeScript + Selenium のXpathでの要素指定ができない

__kuroneko

総合スコア14

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

selenium

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

0グッド

0クリップ

投稿2021/04/21 13:27

前提・実現したいこと

TypeScript + Selenium で自動化テストを作ろうとしています。
ただ、ある画面でのみ要素指定できずにエラーとなってしまいます。

  • Xpathは以下のように指定しています

1.Chrome 上で、XPath を取りたい要素を右クリック、「検証」を選ぶ
2.デベロッパーツール上で該当要素を右クリック、「Copy→Copy XPath」を選ぶ

発生している問題・エラーメッセージ

NoSuchElementError: no such element: Unable to locate element: {"method":"xpath","selector":"<対象のxpath>"}

該当のソースコード

TypeScript

1const webdriver = require('selenium-webdriver'); 2const { Builder, By, until } = webdriver; 3const capabilities = webdriver.Capabilities.chrome(); 4 5const TEST_URL = "https://hogehoge/"; 6const ID = "id"; 7const PW = "pass"; 8 9// ブラウザ立ち上げ 10const driver = new Builder().withCapabilities(capabilities).build(); 11 12// テスト画面を開く 13driver.get(TEST_URL); 14 15// IDを入力 16console.log("IDを入力します"); 17driver.findElement(By.xpath('<対象のxpathを指定>')).sendKeys(ID); 18console.log("IDを入力しました"); 19 20// パスワードを入力 21driver.findElement(By.xpath('<対象のxpathを指定>')).sendKeys(PW);

試したこと

  1. Googleで検索する、という操作で上記と同じようにXpathで要素を指定して実行したところうまくできました。
  2. Python + Selenium で同じXpathを指定して同じような処理をしたところエラーにはならなかったのでXpathが違う、ということはなさそうです

TypeScript

1/* 2Googleで検索してみる 3→これは成功した 4*/ 5 6const webdriver = require('selenium-webdriver'); 7const { Builder, By, until } = webdriver; 8const capabilities = webdriver.Capabilities.chrome(); 9 10const GOOGLE_URL = "https://www.google.com/"; 11const SEARCH_WORD = "TSでselenium"; 12 13const driver = new Builder().withCapabilities(capabilities).build(); 14 15driver.get(GOOGLE_URL); 16 17driver.findElement(By.xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input')).sendKeys(SEARCH_WORD); 18driver.findElement(By.xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[3]/center/input[1]')).click();

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

no such element

ということなので、そのノードが無いのでしょう。

'/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input'

のような危ういXPath指定を使うと、ちょっとでも異なったHTMLになると扱えません。

driver.findElementする直前で、print(driver.page_source)してHTMLを確認しましょう。

投稿2021/04/21 13:58

otn

総合スコア84555

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

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

__kuroneko

2021/04/21 14:08

今はいったんTypeScriptで動かしてみたい、というのを重視してたのでXPath指定にしています。 実際の運用の際はIDを埋め込んでID指定にするつもりです。 困っているのが、Pythonで書いたときとTSで書いたときとで同じXpathを指定しているにも関わらずなぜTSで書いたときだけNoSuchElementになるのかがわかりません…
otn

2021/04/21 15:02 編集

> ちょっとでも異なったHTMLになると扱えません。 と書いたとおりです。 期待通りのHTMLでないことを確認しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問