xpath的结果是对象文本错误,我如何在一个围绕隐藏所有内容而构建的网站上在Ruby中解决这个问题?

Result of xpath is object text error, how do i get around this in Ruby on a site built around hiding everything?

提问人:Daniel 提问时间:9/18/2017 最后编辑:Daniel 更新时间:9/19/2017 访问量:355

问:

我的公司使用方法来隐藏其网站上的大多数数据,我正在创建一个驱动程序,该驱动程序将扫描已关闭的作业以填充数组以创建新作业,因此用户不需要用户输入/数据库访问权限。

我做了研究,似乎这不能像我现在那样做:

# Scan page and place 4 different Users into an array
String name = [nil, nil, nil, nil]
String compare_name = nil
c = 0
tr = 1
while c < 4
  String compare_name = driver.find_element(:xpath, '//*
[@id="job_list"]/tbody/tr['+tr.to_s+']/td[2]/span[1]/a/span/text()[2]').gets
  if compare_name != name[c]
   name[c] = compare_name
       c = +1
       tr = +1
  else if compare_name == name[c]
       tr = +1
     end
  end
end

此外,我是一个边走边学的新手,所以这可能不是最佳选择,或者我学会了如何做我想做的事。

现在,屏幕上我想要的项目的网站代码:

<span ng-if="job.customer.company_name != null &amp;&amp; 
job.customer.company_name != ''" class="pointer capitalize ng-scope" data-
toggle="tooltip" data-placement="top" title="" data-original-title="406-962-
5835">
<a href="/#/edit_customer/903519"class="capitalize notranslate">
    <span class="ng-binding">Name Stuff<br>
     <!-- ngIf: ::job.customer.is_cip_user --
<i ng-if="::job.customer.is_cip_user" class="fa fa-user-circle-o ng-scope">
::before == $0
</i>
> Diago Stein</span>
       </a>
</span>

Xpath 可以找到 Diago Stein 区域,但由于它是文本对象,因此它不起作用。现在要注意的是,所有类标题、按钮名称等都与页面上的其他所有内容相同。他们总是这样做,这使得扫描变得更加困难,因为同样的东西可能在其他地方,可能与网站的这个区域没有任何关系。

有没有办法在不知道基于 HTML 的文本区域中可能有什么的情况下抓取此文本?注意,“Name Stuff”是一家公司的名称,为了保护隐私,我用这个通用名称隐藏了它。

感谢您的任何想法或建议和帮助。

编辑:澄清一下,我不会知道公司名称或用户名(在本例中为 Diago Stein),这部分代码的全部目的是在关闭页面上用此表中的客户名称填充一个数组。

Ruby Selenium XPath 隐藏 的 chrome-web-driver

评论


答:

1赞 JeffC 9/18/2017 #1

您可以将 XPath 备份到一个级别

//*[@id="job_list"]/tbody/tr[' + tr.to_s + ']/td[2]/span[1]/a/span

然后抓取 .是innerTextSPAN

<span class="ng-binding">Name Stuff<br>
  <!-- ngIf: ::job.customer.is_cip_user --
    <i ng-if="::job.customer.is_cip_user" class="fa fa-user-circle-o ng-scope">
      ::before == $0
    </i>
  > Diago Stein</span>

问题是这个HTML中有一些条件,这使得它难以阅读,很难弄清楚实际存在什么。如果我们去掉有条件的,我们就剩下了

<span class="ng-binding">Name Stuff<br>Diago Stein</span>

如果我们接受这个,我们得到innerText

Name Stuff
Diago Stein

这样做的目的是您可以通过回车符拆分字符串,第 0 部分是“Name Stuff”,第 1 部分是“Diago Stein”。因此,您使用定位器找到 , get ,将其拆分为回车符,然后获取第二部分,您就有了所需的字符串。SPANinnerText

此代码未经过测试,但应类似于

name = driver.find_element(:xpath => "//*[@id="job_list"]/tbody/tr[' + tr.to_s + ']/td[2]/span[1]/a/span").get_text.split("\n")[1]

评论

0赞 Daniel 9/18/2017
同样,不能有任何具有现实世界价值的东西,所以一个人或公司的真实姓名我不会知道它正在抓取这些信息是我想要的。
0赞 Daniel 9/18/2017
我的变量名称是空的,我想用值填充它,而你的变量要求我输入一个名称,除非我读错了,否则这不起作用,我想抓取名称 Dieago Stein。添加到上面,因为它没有足够的空间,希望这有助于澄清我在做什么,我需要存储在名称变量中的 xpath 中的文本。我不知道之前的名字,我给出的代码是每个名称字段在页面上的样子,除了名称之外,其他代码完全相同。
0赞 JeffC 9/18/2017
您仍然可以使用第一部分。获取 ,获取 innerHTML,并解析出名称。SPAN
0赞 Daniel 9/19/2017
这在代码中会是什么样子?例如,如果我回退一个关卡,那么我是否在之后添加一些东西,一旦我抓住它,我是否需要集中注意力等等?
0赞 Daniel 9/19/2017
我可能已经弄清楚了这个内部 HTML 的东西,以及如何用它应用于我自己的陈述。.attribute('innerHTML') 我们将看看我是否能找到文本 2 部分,这就是它变得不稳定的地方。我真的无法与任何东西相提并论,所以我不得不扔掉其中的一部分,不知道如何做所有这些事情。所以我仍然对如何通过示例实现这一目标的想法持开放态度。谢谢杰夫,我确实投了你的票,我是新来的,所以它还不会显示。