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

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

ただいまの
回答率

90.00%

pythonのseleniumeで要素をうまく選択できません。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 52

Tochan

score 11

こんばんは。
pythonのseleniumで下記のhtmlソースの中から「<a href="/download.html">ダウンロード・アップロード</a>」部分をクリックしたいと思ったのですがうまくできません。
要素を選択できていないようです。
どうしたらいいでしょうか?

≪htmlソース≫

<!DOCTYPE html>
<html lang="ja">
<body>

<script type="text/javascript">

function showDownloadCountDialog(count, callBack) {
var handlers = [
{
"label": "注意事項に了承してダウンロード開始",
"class": "btn-success",
"callback": function () {
if (callBack) {
callBack();
}
},
},
{
"label": "キャンセル",
"class": "btn-danger",
"callback": function () {
var sendData = new Object();
sendData["download_cancel"] = true;
XMLHttpRequestChange("download.html", null, sendData);
}
},
]
var options = {
backdrop: 'static',
// ヘッダー
header: count + " 件のデータがダウンロードされます",
// ヘッダーのクローズボタン表示
headerCloseButton: false,
// アニメーションの有無
animate: true
}
bootbox.dialog($('#comp_download_count').tmpl(), handlers, options);
}
</script>

<script id="comp_upload_count" type="text/x-jquery-tmpl">
<div class="row-fluid">
<div class="span12">
<div class="alert alert-error">
<p><strong>注意事項</strong></p>
<ul>
<li>10万件を超えるとアップロード終了までに時間がかかります</li>
<li>アップロードが終了するまで他の操作はできません</li>
<li>アップロードに成功した場合は「履歴」から再アップロードできます</li>
<li>タイミングによりメイン機能のデータが変更された等の場合は、表記のアップロード件数と異なる場合があります</li>
</ul>
</div>
<div class="alert alert-info">
データ数が多い場合は、条件を設定して対象を絞ることをお勧めします。
</dib>
</div>
</div>

</script>

<script type="text/javascript">
/*アップロードカウントのダイアログを表示

  • @count アップロード数
  • @connectionId 選択した接続先のID
  • @callBack 選択後のコールバック関数
    */
    function showUploadCountDialog(count, connectionId, callBack) {
    var handlers = [
    {
    "label": "注意事項に了承してアップロード開始",
    "class": "btn-success",
    "callback": function () {
    if (callBack) {
    callBack(connectionId);
    }
    },
    },
    {
    "label": "キャンセル",
    "class": "btn-danger",
    "callback": function () {
    var sendData = new Object();
    sendData["upload_cancel"] = true;
    XMLHttpRequestChange("download.html", null, sendData);
    }
    },
    ]
    var options = {
    backdrop: 'static',
    // ヘッダー
    header: count + " 件のデータがアップロードされます",
    // ヘッダーのクローズボタン表示
    headerCloseButton: false,
    // アニメーションの有無
    animate: true
    }
    bootbox.dialog($('#comp_upload_count').tmpl(), handlers, options);
    }
    </script>

<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<a class="logo" title="" href="/" target="_self" style="float: left;padding-right: 40px;">
<img alt="#" src="resource/img/NE_customDL_Hlogo.png" style="height:38px;">
</a>
<a data-target=".navbar-responsive-collapse" data-toggle="collapse" class="btn btn-navbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>

<div class="nav-collapse collapse navbar-responsive-collapse">
<ul class="nav">

<li class='active'>
<a href="/top.html">トップ</a>
</li>

<li class=''>
<a href="/download.html">ダウンロード・アップロード</a>
</li>

<li class=''>
<a href="/create.html" id="menu_edit">作る</a>
</li>

<li class='dropdown'
style=''>
<a data-toggle="dropdown" class="dropdown-toggle">
設定
<span class="caret"></span>
</a>
<ul class="dropdown-menu">

<li class=''>
<a href="/setting_item_name.html">項目名の設定</a>
</li>

<li class=''>
<a href="/setting_format.html">出力形式パターンの設定</a>
</li>

<li class=''>
<a href="/setting_table.html">条件パターンの設定</a>
</li>

<li class=''>
<a href="/setting_custom.html">オリジナル項目の設定</a>
</li>
</ul>
</li>

<li class=''>
<a href="/history.html">履歴</a>
</li>

<li class=''>
<a href="/setting_plan.html">料金プラン</a>
</li>

<li>
<a href="#" target="_blank" id="manual_link">マニュアル</a>
</li>
</ul>
</div>

</div>
</div>

<div class="contentainer_wrapper" id="container">
<div class="container-fluid">

<div class="page-body">
<div class="row-fluid">
<div class="span12">
<div class="wrapper">
<div class="content_wrapper">
<div class="contents">
<div class="notification_div alert alert-info" style="display:none;">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong class="notification_msg"></strong>
<div class="append_notification_msg"></div>
</div>
<div class="alert_div alert alert-error" style="display:none;">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong class="alert_msg"></strong>
<div class="append_alert_msg"></div>
</div>

<div class="row-fluid">
<div class="widget_wrapper">
<div class="widget_header">
<h3>メンテナンスのお知らせ</h3>
</div>

<div class="widget_content" style="background-color: #fcf8e3;">
<dl>
<dd><h5>毎週水曜の18:30〜20:30にアプリの定期メンテナンスを行います。定期メンテナンス中はアプリを使用できません。ご理解とご協力をどうぞよろしくお願いします。</p>
</h5></dd>
</dl>
</div>

</div>
</div>

<div class="row-fluid">
<div class="widget_wrapper">
<div class="widget_header ">
<h3>Hameeからのお知らせ</h3>
</div>
<div class="widget_content">
<dl class="dl-horizontal-home" id="top_information"></dl>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

</body>

</html>

≪クリックしたい要素≫

<li class=''>
<a href="/download.html">ダウンロード・アップロード</a>

</li>

≪試したコード≫

リンクテキスト名の要素を取得

element = driver.find_element_by_partial_link_text("ダウンロード・アップロード")

取得した要素をクリック

element.click()

≪エラー≫

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"partial link text","selector":"ダウンロード・アップロード"}

(Session info: chrome=78.0.3904.108)

  •  

≪他にも試したコード≫↓すべてエラーでした。

driver.find_element_by_partial_link_text(u'ダウンロード・アップロード').click()

driver.find_element_by_xpath('/html/body/div[4]/div/div/ul/li[2]/a').click()

continue_link = driver.find_element_by_partial_link_text(u'ダウンロード・アップロード')

continue_link.click()

#driver.find_element_by_css_selector('li.active').click()

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

以下でどうでしょうか。

driver.get(driver.current_url + '/download.html')


ダメだったら、

driver.get(driver.current_url + 'download.html')

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/03 23:48

    あとは
    from time import sleep
    でsleepをimportして、
    sleep(10)
    と打った直後に、
    driver.find_element_by_link_text('ダウンロード・アップロード').click()
    なんて手もあるかもしれません。

    キャンセル

  • 2019/12/04 12:55

    回答、ありがとうございます。
    2つ共、試してみましたところ、エラーはでなかったのですが無反応でした。

    反応しないので、クリックをさせるには「.click」を付けないといけないのかと思いましたので↓としたところ、

    driver.get(driver.current_url + '/download.html').click()

    ↓のエラーコードがでてしまいました。
    AttributeError: 'NoneType' object has no attribute 'click'


    教えて頂いた↓も試しました。

    from time import sleep
    sleep(10)
    driver.find_element_by_link_text('ダウンロード・アップロード').click()

    ↑も試してみたところ、「NoSuchElementException: Message: no such element: Unable to locate element: {"method":"link text","selector":"ダウンロード・アップロード"}」のエラーがでました。

    「driver.find_element_by_partial_link_text('ダウンロード').click()」の部分一致も試しましたが同様のエラーでした。

    他に対処方法は考えられますでしょうか?

    キャンセル

  • 2019/12/04 14:43

    では、ページを開いた後、クリックの前に
    print(driver.page_source)と打って見てください。

    文字通りhtmlソースが全て表示されますが、
    この表示された中に件のaタグは存在しますか?

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる