Xpath点击不起作用

时间:2017-12-22 22:51:42

标签: python html selenium xpath element

快速信息:我使用的是Mac OS,Python 3。

我有800个链接需要在页面上点击(还有更多页面需要自动化)。

它们是隐藏的,因为当您将鼠标悬停在上方时,您只会看到这些链接。 我通过注入CSS规则来解决这个问题(只是说它以及它不起作用的原因)。

当我尝试通过xpath查找元素时,它不希望之后单击链接,并且它也不会发现它们总是只有4(即使在视图中显示更多)。

HTML:

<a href="#" title="Display">Display</a>

当我在检查中单击确定复制xpath时,它会给我:

//*[@id="tiles"]/li[3]/div[2]/ul/li[2]/a

但是当我像这样使用它时它不起作用:

driver.find_elements_by_xpath('//*[@id="tiles"]/li[3]/div[2]/ul/li[2]/a')

所以有两个问题:

  1. 我如何得到它们?
  2. 如何让它点击每一个?
  3. XPath中的模式是相同的,/li[3]是唯一更改的数字,为此,我创建了一个for循环,根据我成功完成的页数创建它们。

    因此,如果可以使用我自己生成的XPath来完成,这与我在检查器中复制XPath时相对应,那么我只需要回答问题2。

    PS:这是第一个HTML的父级HTML:

    <li onclick="openPopup(event, 'collect', {item_id: 165214})" class="collect" data-item-id="165214"><a href="#" title="Display">Display</a></li>
    

3 个答案:

答案 0 :(得分:1)

这个XPath,

//a[.="Display"]

将选择锚文本等于a的所有"Display"个链接。

答案 1 :(得分:0)

根据您的问题,您共享的HTML和您的代码尝试没有必要获取<li>标记。相反,我们会在列表中获取<a>标记。因此,要回答您的第一个问题How do I get them all,您可以使用以下代码行:

all_Display = driver.find_elements_by_xpath("//*[@id='tiles']//li/div[2]/ul/li[@class='collect']/a[@title='Display']")

下一页to click on each of them您必须创建一个loop来迭代所有<a>标记,如下所示:

all_Display = driver.find_elements_by_xpath("//*[@id='tiles']//li/div[2]/ul/li[@class='collect']/a[@title='Display']")
for each_Display in all_Display :
    each_Display.click()

答案 2 :(得分:0)

使用带位置元素的XPath并不理想。而是使用CSS选择器来匹配目标元素的属性。

类似的东西:

all_Display = driver.find_elements_by_css_selector("#tiles li[onclick][data-item-id] a[title]")

如果它们都没有加载新页面,则可以在循环中单击它们:

for element in all_Display:
    element.click()