请帮忙。我试图从网站获取数据,然后计算某些文本的出现次数。不幸的是,我不能提供实际的网站,但基础是这个。
网页已加载,我会看到一个值列表,这些值位于表格中(下面的代码反映了这一点)。该页面看起来像这样。
标题
表1
A00001
A00002
A00003
A00004
...
A00500
上述每一行(A00001- A00500)代表我需要点击的链接。此外,每个链接都会导致我需要从中提取信息的唯一页面。
我正在使用selenium来获取信息并将其存储为可变数据,如下面的代码所示。这是我的问题 - 我需要点击的链接/行数取决于我的用户在GUI中选择的时间范围。从我的代码中可以看出,从2011年5月1日到2011年5月30日的时间范围产生了一个包含我需要点击的184个不同链接的列表。
from selenium import selenium
import unittest, time, re
class Untitled(unittest.TestCase):
def setUp(self):
self.verificationErrors = []
self.selenium = selenium("localhost", 4444, "*chrome", "https://www.example.com")
self.selenium.start()
def test_untitled(self):
sel = self.selenium
sel.open("https://www.example.com")
sel.click("link=Reports")
sel.wait_for_page_to_load("50000")
sel.click("link=Cases")
sel.wait_for_page_to_load("50000")
sel.remove_selection("office", "label=")
sel.add_selection("office", "label=San Diego")
sel.remove_selection("chapter", "label=")
sel.add_selection("chapter", "label=9")
sel.add_selection("chapter", "label=11")
sel.type("StartDate", "5/1/2011")
sel.type("EndDate", "5/30/2011")
sel.click("button1")
sel.wait_for_page_to_load("30000")
Case 1 = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table.1.0")
Case 2 = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table.2.0")
Case 3 = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table.184.0")
def tearDown(self):
self.selenium.stop()
self.assertEqual([], self.verificationErrors)
如果名称 ==“主要”: unittest.main()
我对两件事感到困惑。
1)在不知道提前链接数量的情况下,让selenium点击页面上的所有链接的最佳方法是什么?我知道如何执行此操作的唯一方法是让用户选择GUI中的链接数,这些链接将分配给变量,然后可以包含在以下方法中:
number_of_links =输入(“页面上有多少个链接?”) sel.get_table( “// DIV [@ ID = 'cmecfMainContent'] /中心[2] / NUMBER_OF_LINKS”)
2)我也对如何计算链接所在页面上出现的某些数据的出现感到困惑。
即
A00001指向包含表值“Apples”
的页面A00002会指向包含表值“Oranges”
的页面A00003指向包含表值“Apples”的页面 “
我知道selenium可以将它们存储为变量,但我不确定是否可以将它们保存为序列类型,每个附加的事件都附加到原始列表(或添加到字典中),然后可以用len()函数计算。
感谢您的帮助
答案 0 :(得分:3)
我对python api并不熟悉,对不起,但在java中我知道使用xpath有一个函数来获取xpath的出现次数。因此,您可以编写一个xpath选择器来查找所需的元素,然后获取该路径的出现次数。
然后点击每一个你可以用[1]之类的元素选择器粘贴你的xpath,所以如果你的xpath是//somexpath/something do //somexpath/something[1]
来得到第一个。
希望有所帮助
下面是一个例子:我在java中编写了一个糟糕的api,能够像xpath匹配集合那样对jquery进行操作。我的构造函数匹配xpath得到计数然后创建所有匹配的列表,所以我可以做像.clickAll()
这样的事情 public SelquerySelector(String selector, Selenium selenium) {
super("xpath=(" + selector + ")[" + 1 + "]", selenium);
this.xpath = selector;
this.selenium = selenium;
//find out how many elements match
this.length = selenium.getXpathCount(this.xpath).intValue();
//make an array of selectedElements
for(int i = 2; i <= this.length; i++) {
elements.add(new SelquerySelectedElement("xpath=(" + this.xpath + ")[" + i + "]", this.selenium));
}
}
如果你想看到它,请提供整个代码:
<强> http://paste.zcd.me/Show.h7m1?id=8002 强>
所以我想回答你的问题(不知道xpath如何匹配表)你可能会做类似
的事情 //div[@id='cmecfMainContent']/center[2]/table
并获取匹配的数量以获得链接的总量然后循环它们。如果你不能用xpath做到这一点,请继续假设它们是另一个链接,直到你得到一个接受
for i in range(1,xpathmatchcount):
Case[i] = sel.get_table("//div[@id='cmecfMainContent']/center[2]/table." + i + ".0")