【问题标题】:Selenium: Get all visible text in Tableau viewSelenium:获取 Tableau 视图中的所有可见文本
【发布时间】:2018-07-30 06:01:43
【问题描述】:

我正在尝试使用 Selenium 从 Tableau 视图中获取所有可见文本。我将所有可见文本定义为可以使用任何浏览器的搜索功能(即 Ctrl+F)搜索的任何文本。

我已经搜索了许多其他相关问题的答案,但没有一个适合我的案例。我尝试了here 的最佳答案。它从一开始就对我不起作用,因为我的browser.page_source 不包含可见文本。以下是我browser.page_source的内容:

<!DOCTYPE html><html xmlns:ng="" xmlns:tb=""><head><style type="text/css">@charset "UTF-8";[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=1024, maximum-scale=1.3"><meta name="apple-itunes-app" content="app-id=434633927"><meta name="format-detection" content="telephone=no"><script>var BuildId = '9qu3thidy901n388pewixusor';
var StaticAssetsUrlPrefix = '';</script><link rel="stylesheet" type="text/css" href="vizportal.css?9qu3thidy901n388pewixusor"><script src="/javascripts/api/tableau-2.1.0.min.js?9qu3thidy901n388pewixusor"></script><script src="vizportalMinLibs.js?9qu3thidy901n388pewixusor"></script><script src="vizportal.min.js?9qu3thidy901n388pewixusor"></script></head><body class="tb-body"><div ng-app="VizPortalRun" id="ng-app" tb-window-resize="" class="tb-app ng-scope"><!-- uiView:  --><div ui-view="" class="tb-app-inner ng-scope"></div><span class="ng-isolate-scope"><div class="tb-toaster tb-enable-selection" data-reactid=".0"></div></span><script type="text/ng-template" id="inline_stackedElement.html"><div tb-window-resize tb-left="left" tb-top="top" tb-right="right" tb-bottom="bottom" tb-visible="visible" class="tb-absolute"></div></script><!-- ngRepeat: stackedElement in stackedElements --><span props="stackedComponentsProps" class="ng-isolate-scope"><div data-reactid=".1"></div></span></div></body></html>

还尝试了最佳答案here。显然,这不起作用,因为您可以在上面的页面源代码中看到 body 中没有文本。

在这些情况下获取可见文本的正确方法是什么?

【问题讨论】:

    标签: python selenium tableau-api


    【解决方案1】:

    正如我一直说的pages_source 获取源但不一样,Inspect Element 检查DOM,源页面虽然实际上是DOM 的原始种子页面,DOM 可以动态更改并且通常由 JS 代码更改, 有时相当戏剧化。您还会注意到Inspect Element 显示了源不显示的阴影元素。

    要了解差异有多大,请访问 chrome://settings/ 并单击 Inspect element,然后查看 View page source 并进行比较。

    所以你需要从DOM 获取你需要的东西,你可以遍历所有标签并获得textContent 这是 JS sn-p:

    page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; 
    

    或在 selenium/python 中:

    import selenium
    from selenium import webdriver
    driver = webdriver.Chrome()
    
    driver.get("http://ranprieur.com")
    pagetext = driver.execute_script('page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; return page;')
    

    【讨论】:

    • 我知道页面源不显示任何动态内容,只是不知道有任何其他方法可以做到这一点。我尝试在 Python 中执行您的代码并得到以下异常:selenium.common.exceptions.WebDriverException: Message: {"errorMessage":"Expected token 'in'","request":{"headers": ... *lots of header info*... }} Screenshot: available via screen
    • @MaxLawnboy Run Ctrl+Shift+J 尝试粘贴 page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; console.log(page); 你得到你想要的文字了吗?
    • @MaxLawnboy 我认为错误可能与我的代码无关我运行了代码查看更新,对我来说它工作得很好
    • 是的,你是对的。如果我从浏览器控制台运行您的脚本,我会得到预期的结果。我猜我在使用 Selenium webdriver 访问网页时遇到的错误是由于身份验证问题。接下来需要弄清楚这一点。感谢您的帮助!
    • @MaxLawnboy 您可以使用配置文件文件夹并手动登录,登录信息将保存在 cookie 等中,请参阅:stackoverflow.com/a/48873573/1577343
    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多