Python selenium - 修改网页的源代码

Posted

技术标签:

【中文标题】Python selenium - 修改网页的源代码【英文标题】:Python selenium - modifying the source code of a webpage 【发布时间】:2017-01-25 09:01:57 【问题描述】:

我正在使用 Python selenium 来自动化我的考勤输入。它工作正常,现在我想通过修改源代码来尝试。我看到很少有帖子说它可以使用driver.execute_script() 进行修改并且它适用于javascript,但在我的情况下,我需要修改select 标签下的源代码。我能够使用inspect element 修改源代码。以下为select标签源码:

<select name="date1">
    <option value="2016-09-17">2016-09-17</option>
    <option value="2016-09-16">2016-09-16</option>
    <option value="2016-09-14">2016-09-14</option>
</select>

我试着用driver.execute_script() 来做。以下是我的代码:

sel = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/form/table/tbody/tr[2]/td[3]/select')
input_list = sel.find_element_by_tag_name('option')
cmd = "input_list.value = '2016-09-07'"
driver.execute_script(cmd)

但是上面的代码给了我以下错误:

selenium.common.exceptions.WebDriverException:消息:input_list 未定义

我可以使用inspect element 窗口修改源代码。有没有办法使用 selenium 修改源代码?

【问题讨论】:

【参考方案1】:

尝试以下解决方案,如果出现任何问题,请告诉我:

driver.execute_script("""document.querySelector("select[name='date1'] option").value="2016-09-07";""")

附:我建议您不要在选择器中使用绝对 XPath,而是使用相对

【讨论】:

非常感谢。有效。代码有一个小错误,我编辑了。【参考方案2】:

问题是execute_script 在浏览器 [1] 中执行 JavaScript,它对 python 脚本中的 python 变量一无所知。特别是 input_list 没有为 JavaScript 定义,因为它是一个 Python 变量。

要解决此问题,您可以选择 JavaScript 文件中的元素。为此,您可以将 cmd 设置为类似 [2]:

    function getElementByXpath(path) 
      return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    

    getElementByXpath("/html/body/div[3]/div/div[2]/form/table/tbody/tr[2]/td[3]/select/option[1]").value = '2016-09-07';
<html>
  <body>
    <div></div>
    <div></div>
    <div>
      <div>
        <div></div>
        <div>
          <form>
            <table>
              <tbody>
                <tr></tr>
                <tr>
                  <td></td>
                  <td></td>
                  <td>
                    <select name="date1">
                      <option value="2016-09-17">2016-09-17</option>
                      <option value="2016-09-16">2016-09-16</option>
                      <option value="2016-09-14">2016-09-14</option>
                    </select>
                  </td>
                </tr>
              </tbody>
            </table>
          </form>
        </div>
      </div>
    </div>
    

[1]https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.execute_script

[2]Is there a way to get element by Xpath using JavaScript in Selenium WebDriver?

【讨论】:

非常感谢,但 Anderson 建议的脚本无需任何额外的 JavaScript 即可工作。【参考方案3】:

python 中使用这个:

element = driver.find_element_by_id("some-random-number")
driver.execute_script("arguments[0].innerText = 'change text'", element)

【讨论】:

以上是关于Python selenium - 修改网页的源代码的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫-27-python之Selenium入门,动态网页抓取

使用 web 驱动程序从 python 中的源页面获取所有文本

用爬虫抓取网页得到的源代码和浏览器中看到的不一样运用了啥技术?

如果通过 python selenium 和美丽的汤嵌套在视频内的源标签内,则无法抓取 src

python下用selenium的webdriver包如何在执行完点击下一页后获得下一页新打开页面的html源代码呢?

selenium官网是动态网页吗