在2个不同的Xpath中寻找2件事 - Python Selenium

时间:2018-04-15 02:41:49

标签: python selenium-webdriver xpath

我正在为一个网站开发机器人,它需要一个颜色和关键字才能找到该项目。我使用selenium从关键字中查找项目,然后选择一个颜色选项(网站上的一些项目,提供多种颜色的项目)。我无法同时查找关键字和颜色,然后从用户的颜色和关键字输入中选择正确的项目颜色版本。我希望它选择该选项。

我想在Python中制作的公式:

 If the first Xpath(keyword) is found and the 2nd Xpath(color) is found
 Then select on the item that contains those 2 properties.

这是我目前的代码:

 Item = driver.find_element_by_xpath('//*[contains(text(), "MLK")]' and contains ("Black")]')

if (item != None):
    actions.moveToElement(item).click()

我已经尝试过上面的代码,但它不起作用。

以下是我要合并以查找项目的两段代码:

  1. driver.find_element_by_xpath('//a[contains(text(), "MLK")]')

  2. driver.find_element_by_xpath('//a[contains(text(), "Black")]')

  3. 该关键字名为MLK

    颜色称为Black

    合并后,我想找到精确元素(称为MLK,颜色版本=黑色)

    应点击此组合项目,我只知道使用.click() 如果有更好的方法,请告诉我。

    我用来制作机器人的网站:supremenewyork.com 我使用的项目,例如,选择一种颜色(它是带有MLK的运动衫):http://www.supremenewyork.com/shop/all/sweatshirts

3 个答案:

答案 0 :(得分:0)

尝试使用union “|”运算符组合两个xpath。

实施例: -

//p[@id='para1'] | //p[@id='para2']

('//a[contains(text(), "MLK")]' | '//a[contains(text(), "Black")]')

答案 1 :(得分:0)

您可以使用完整的XPath根据两个条件选择所需的项目,只需从父节点开始,然后在子节点上应用条件:

BufferedWriter

首先需要选择元素本身,然后你需要从元素中获取属性@href,如下所示:

//div[contains(./h1/a/text(), "MLK") and contains(./p/a/text(), "Black")]/a/@href

答案 2 :(得分:-1)

我花了一秒钟才意识到每件衬衫有3个A标签......一个用于图像,一个用于衬衫的名称,一个用于颜色。由于最后两个A标记是您要进行文本搜索的标记,因此您无法在同一A标记中查找这两个字符串。我已经测试了下面的XPath,它可以工作。

//article[.//a[contains(.,'MLK')]][.//a[.='Black']]//a

ARTICLE是衬衫的容器。此XPath正在寻找包含ARTICLE标记的A标记,其中包含“MLK”标记。然后另一个A标记包含' Black'然后找到A标记后代的ARTICLE标记。你可以点击它们中的任何一个,它们都是相同的链接。

顺便说一句,你的代码有问题。如果没有匹配,下面的第一行将抛出异常,因此永远不会到达下一行来测试None

Item = driver.find_element_by_xpath('//*[contains(text(), "MLK")]' and contains ("Black")]')
if (Item != None):
    actions.moveToElement(item).click()

更好的做法是使用.find_elements()(复数)并检查空列表。如果列表为空,则表示没有与定位器匹配的元素。

把各个部分放在一起:

items = driver.find_elements_by_xpath("//article[.//a[contains(.,'MLK')]][.//a[.='Black']]//a")
if items:
    items[0].click()

我假设您将重复调用此代码,因此我建议您将其放入函数中并传递要搜索的两个字符串。我让你从这里拿走它......