2

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

我做了研究,似乎不能按照我的方式完成:

# 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),这部分代码的全部目的是用关闭页面上此表中的客户名称填充数组。

4

1 回答 1

1

您可以将 XPath 备份到上一级

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

然后抓住innerText. SPAN是_

<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 部分是“名称材料”,第 1 部分是“Diago Stein”。因此,您使用定位器查找SPAN, get innerText,用回车符分割它,然后取第二部分,您就得到了您想要的字符串。

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

name = driver.find_element(:xpath => "//*[@id="job_list"]/tbody/tr[' + tr.to_s + ']/td[2]/span[1]/a/span").get_text.split("\n")[1]
于 2017-09-18T04:44:56.023 回答