Python Selenium在本地HTML字符串上的应用

13

我正在尝试在本地HTML字符串上运行Selenium,但似乎找不到任何关于如何这样做的文档。我从电子邮件API中检索HTML源代码,因此Selenium无法直接解析它。有没有办法修改以下内容,以便它可以读取下面的HTML字符串:

远程访问的Python代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_class_name("q")

本地HTML代码:

s = "<body>
        <p>This is a test</p>
        <p class="q">This is a second test</p>
     </body>"

应该是 .find_element_by_class_name 吧?这是潜在的问题还是只是打错了呢? - smoggers
预期输出是什么或者为什么它现在不起作用? - memoselyk
4个回答

22
如果您不想在能够替换页面内容之前创建文件或加载URL,您始终可以利用支持HTML、CSS和JavaScript的数据URL特性: Data URLs
from selenium import webdriver

driver = webdriver.Chrome()
html_content = """
<html>
     <head></head>
     <body>
         <div>
             Hello World =)
         </div>
     </body>
</html>
"""

driver.get("data:text/html;charset=utf-8,{html_content}".format(html_content=html_content))

此处限制为65535个字符。 - Remy Ticona
是的和不是的,这实际上取决于您使用的浏览器。请参考 https://dev59.com/SHRB5IYBdhLWcg3wLkxM#41755526。 - jolancornevin

16

如果我理解问题正确,我可以想象有两种方法来实现这个目标:

  1. 将HTML代码保存为文件,并将其作为URL加载:file:///file/location。问题在于,不同的操作系统/浏览器可能会有不同的文件位置和文件如何被浏览器加载。但是,另一方面,实现非常简单。
  2. 另一种选择是将您的代码注入到某个页面上,然后像普通动态HTML一样处理它。我认为这更可靠,但也需要更多的工作。 这个问题有一个很好的例子。

我想我会选择注入。谢谢。 - user2694306
我发现以下代码适用于我:location = "file:///Users/your_username/github/login_automation/landing.html" driver.get(location) print(driver.page_source) - ravindrab

6
这是我做基本生成测试的解决方案,无需制作大量临时本地文件。
import json
from selenium import webdriver
driver = webdriver.PhantomJS()  # or your browser of choice

html = '''<div>Some HTML</div>'''
driver.execute_script("document.write('{}')".format(json.dumps(html)))
# your tests

不确定为什么这个被踩了,但对我来说似乎解决了问题。 - laverick
1
很遗憾,但是会抛出一个Javascript异常:SecurityError: The operation is insecure. - wp78de
re.escape is more appropriate than json.dumps to turn the special characters of a string into escaped characters. The latter won't escape single quotes, for example, and this breaks the string within document.write() - Mutoh

-1

如果我理解正确,您只是想从一个元素中获取文本。如果是这样的话,那么下面的代码应该符合您的需求:

    elem = driver.find_element_by_class_name("q").text
    print elem

假设“q”是您需要的元素。

我正在尝试解析本地字符串。因此,我希望将HTML字符串传递给“driver.get”,而不是将URL提供给它。 - user2694306

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接