【问题标题】:Python selenium how to execute execute_script on a JavaScript element with argumentsPython selenium 如何在带有参数的 JavaScript 元素上执行 execute_script
【发布时间】:2019-08-24 14:47:26
【问题描述】:

我正在尝试从网站下载文档。 当我在浏览器中检查元素时,我得到的是:

<td width="3%" align="left" id="tdvPDF0" colspan="3">
<a href="#" onclick="javaScript:downloadClicked('JRAOB2SNRXEAPX2', 0, 'PDF'); return false;" onmouseover="window.status='CTNF'; return true" onmouseout="window.status=''; return true">PDF</a>
/&nbsp;
<a href="#" onclick="javaScript:downloadClicked('JRAOB2SNRXEAPX2', 0, 'XML_LINK'); return false;" onmouseover="window.status='CTNF'; return true" onmouseout="window.status=''; return true">XML</a>
/&nbsp;
<a href="#" onclick="javaScript:downloadClicked('JRAOB2SNRXEAPX2', 0, 'DOCX'); return false;" onmouseover="window.status='CTNF'; return true" onmouseout="window.status=''; return true">DOCX</a>
</td>

我想下载所有三个文档,即 PDF、XML 和 DOCX。 这个 JavaScript 可以接受三个参数。在这种情况下,它们是: 1. JRAOB2SNRXEAPX2(字符串) 2. 0(整数) 3. PDF(字符串)

我不知道如何确定第一个参数的正确输入(在本例中:“JRAOB2SNRXEAPX2”)

无论第一个参数如何,我都想让我的代码正常工作。

以前,当我遇到 JavaScript 函数时,我使用了以下函数:

driver.execute_script(name_of_JavaScript_script())

这通常会起作用,但是我从未遇到过像这种情况下带有参数的 JavaScript,例如downloadClicked('JRAOB2SNRXEAPX2', 0, 'PDF')

我尝试了以下但没有成功:

driver.execute_script(downloadClicked('JRAOB2SNRXEAPX2', 0, 'PDF'))
driver.execute_script(downloadClicked(''JRAOB2SNRXEAPX2', 0, 'PDF''))
driver.execute_script(downloadClicked('JRAOB2SNRXEAPX2', 0, 'PDF')); return false;

以及许多其他类似的选项。

我也试过了:

javascript = driver.find_element_by_id('tdvPDF0').click()
driver.execute_script(javascript)

另外我试过了:

driver.find_element_by_id('tdvPDF0').click()

函数的代码目前如下所示:

def private_pair_ifw_downloader(driver, application_number, pause=1):
    private_pair_enter_application(driver, application_number)
    time.sleep(pause)
    driver.execute_script('submitTab("ifwtab")')
    time.sleep(pause)

    driver.execute_script('"javaScript:downloadClicked(''JRAOB2SNRXEAPX2', 0, 'PDF''); return false;"')

我希望代码调用 JavaScript 函数,该函数反过来应该下载 PDF 文件,但是,我收到以下错误:

Traceback(最近一次调用最后一次): 文件“C:/Workspaces/patents_repo/USPTO_scraper/uspto_private_pair_scraper.py”,第 41 行,在 private_pair_ifw_downloader(驱动程序,'15723211') 文件“C:\Workspaces\patents_repo\utils\web_utils.py”,第 211 行,位于 private_pair_ifw_downloader driver.execute_script('"javaScript:downloadClicked(''JRAOB2SNRXEAPX2', 0, 'PDF''); return false;"') 文件“C:\Users\eitan\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 636 行,在 execute_script 'args': convert_args})['value'] 执行中的文件“C:\Users\eitan\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 321 行 self.error_handler.check_response(响应) 文件“C:\Users\eitan\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py”,第 242 行,在 check_response 引发异常类(消息、屏幕、堆栈跟踪) selenium.common.exceptions.WebDriverException:消息:未知错误:Runtime.evaluate 抛出异常:SyntaxError:意外标识符 (会话信息:chrome=76.0.3809.100)

【问题讨论】:

    标签: javascript python selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    您所要做的就是将您输入到 execute_script 的内容用双引号括起来。

    driver.execute_script("downloadClicked('JRAOB2SNRXEAPX2', 0, 'PDF');")
    

    【讨论】:

    • 我该如何处理关于第一个参数的问题?我必须在这里输入某种类型的字符串吗?不知道字符串怎么办?
    • 您可以将值作为参数作为 execute_script 的一部分传递。
    【解决方案2】:

    如果你不知道字符串,你可以试试这样的:

    driver.execute_script('document.querySelector("a[onclick*=PDF]").onclick()')
    

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2019-09-04
      • 2013-04-08
      相关资源
      最近更新 更多