作为一个实验,我想测试如何使用Ruby,Selenium和Web驱动程序来访问一个复杂的网站。在这个测试中,我想我可以访问flights.google.com,看看如何在页面上找到一些东西,快速浏览一下视觉上看起来简单但复杂的生成视图的动态本质。
看起来很简单例如,站点为flights.google.com,输入两个目的地点(例如SFO到LAX),URL将为https://www.google.com/travel/flights/search?tfs=CBwQAhogEgoyMDIzLTA2LTE0KABqBwgBEgNTRk9yBwgBEgNMQVgaIBIKMjAyMy0wNi0xOCgAagcIARIDTEFYcgcIARIDU0ZPQAFIAXABggELCP___________wGYAQE
现在,当页面生成时,您会得到一些很好的航班显示列表,如果我想找到一个结果,它不是一个可读的命名项目集。
<div class="yR1fYc" jsaction="click:O1htCb;gP4E0b:O1htCb;DIjhEc:YmNhJf" jsname="BXUrOb">
<div class="mxvQLc ceis6c uj4xv uVdL1c A8qKrc" jsname="HSrbLb">…</div>
</div>
我通常会使用Webdriver和Selenium
require 'selenium-webdriver'
require 'capybara'
driver = Selenium::WebDriver.for :chrome
driver.get 'https://www.google.com/flights/'
然后使用查找元素的方法处理一些命名元素
flights = driver.find_elements_by_class_name('flight')
在这种情况下,它是一个更神秘的名称,所以不知道如何解决这个问题,如果我假设类的名称可能是动态生成的。
有什么建议或办法吗?
2条答案
按热度按时间bxfogqkk1#
TL;DR
如果混淆是故意的并且不断发展,您可能无法永久解决问题。但是,对于那些不故意违反标准的网站,您可以遵循一些最佳实践。您可能只需要重新构建您的解决方案,以便在面对动态内容时不那么脆弱,并找出页面上的哪些内容没有改变。
分析及建议
如果您正在处理动态生成的内容,则需要以下一项或多项:
例如,如果您可以依赖于给定
div
容器中的某个地方的“First Name”,则可以使用XPath表达式查找父容器,然后从那里进行更结构化或更宽松的搜索。水豚是相当强大的,但有时你必须做自己的解析。如果发生这种情况,看看Nokogiri提供了什么,看看你是否可以做你想要的,即使你必须执行多个提取/搜索步骤来完成它。
并不是所有的事情都有一行程序作为解决方案。动态网站被设计成破坏标准工具,如机械化或基于CSS的解析器,我想,这样做通常是有原因的,即使它经常破坏与标准的兼容性。假设他们也没有故意破坏辅助功能,如ALT文本或其他辅助功能属性,你可能会考虑利用这些或类似的辅助功能,因为商业网站通常需要满足ADA或508节标准,无论他们如何滥用DOM。
yquaqz182#
你仍然可以依靠结构,因为结构不是随机的;像这样的CSS选择器应该能够给予你结果的列表元素,而不依赖于类名: