Je travaille sur un bot pour un site Web et il faut une couleur et un mot-clé pour trouver l'article. J'utilise du sélénium pour rechercher l'article dans le mot clé, puis je choisis une option de couleur (certains articles sur le site Web, fournissent l'article en plusieurs couleurs). J'ai du mal à rechercher à la fois le mot-clé et la couleur, puis après avoir choisi la bonne version colorée de l'article dans la couleur et le mot-clé de l'utilisateur. Je veux qu'il sélectionne cette option.

Formule que j'essaie de faire en 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.

Voici le code que j'ai actuellement:

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

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

J'ai essayé le code ci-dessus et cela ne fonctionne pas.

Voici les 2 morceaux de code que je veux fusionner pour trouver l'article:

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

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

Le mot clé s'appelle MLK

La couleur s'appelle Black

Après la fusion, je veux trouver cet élément exact (appelé MLK, version couleur = noir)

Il faut cliquer sur cet élément combiné, je sais seulement utiliser .click() Si une meilleure façon, faites-le moi savoir.


Le site Web que j'utilise pour créer un bot pour: supremenewyork.com L'élément que j'utilise comme exemple, pour choisir une certaine couleur (c'est le sweat avec MLK dessus): http://www.supremenewyork.com/shop/all/sweatshirts

0
sniperipp 15 avril 2018 à 05:41

3 réponses

Meilleure réponse

Il m'a fallu une seconde pour réaliser qu'il y a 3 A balises pour chaque chemise ... une pour l'image, une pour le nom de la chemise et une pour la couleur. Étant donné que les deux dernières A balises sont celles que vous souhaitez rechercher dans le texte, vous ne pouvez pas rechercher les deux chaînes dans la même balise A. J'ai testé le XPath ci-dessous et cela fonctionne.

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

ARTICLE est le contenant de la chemise. Ce XPath recherche une balise ARTICLE qui contient une balise A qui contient 'MLK' puis une autre balise A qui contient 'Black' trouve ensuite les balises A qui sont des descendants de la balise ARTICLE. Vous pouvez cliquer sur l'un d'eux, ils sont tous le même lien.

BTW, votre code a un problème. La première ligne ci-dessous lèvera une exception s'il n'y a pas de correspondance, de sorte que la ligne suivante ne sera jamais atteinte pour tester None.

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

Une meilleure pratique consiste à utiliser .find_elements() (pluriel) et à rechercher une liste vide. Si la liste est vide, cela signifie qu'aucun élément ne correspond au localisateur.

Assembler les morceaux:

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

Je suppose que vous appellerez ce code à plusieurs reprises, donc je vous suggère de le mettre dans une fonction et de passer les deux chaînes à rechercher. Je vous laisse le prendre d'ici ...

-1
JeffC 15 avril 2018 à 15:54

Vous pouvez utiliser un XPath complet pour sélectionner l'élément que vous souhaitez en fonction de deux conditions, il vous suffit de démarrer à partir d'un nœud parent, puis d'appliquer les conditions sur les nœuds enfants:

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

Vous devez d'abord sélectionner l'élément lui-même, après quoi vous devez obtenir l'attribut @href de l'élément, quelque chose comme ceci:

Item = driver.find_element_by_xpath('//div[contains(./h1/a/text(), "MLK") and contains(./p/a/text(), "Black")]/a')
href = Item .get_attribute("href")
0
Ayoub_B 15 avril 2018 à 13:35

Essayez l'union "|" pour combiner deux xpath.

Exemple:-

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

('//a[contains(text(), "MLK")]' | '//a[contains(text(), "Black")]')
0
sunny_teo 15 avril 2018 à 09:56