[Perl] Capturer un élément avec Selenium

Patrice Karatchentzeff patrice.karatchentzeff at gmail.com
Ven 26 Avr 09:19:33 CEST 2024


Bon, je n'y arrive toujours pas :(

Voici le xpath (partiel et total ) que je teste désormais :

//*[@id="arc-srp_150"]/div/div[10]/div/div/div[1]/div/div/span/a/div/div/div/div[2]/cite
/html/body/div[4]/div/div[13]/div/div[4]/div/div[4]/div[3]/div[5]/div/div[10]/div/div/div[1]/div/div/span/a/div/div/div/div[2]/cite

et le code css/html

<cite class="qLRx3b tjvcx GvPZzd cHaqb"
role="text">https://gamefaqs.gamespot.com<span class="ylgVCe ob9lvb"
role="text"> › 4...</span></cite>

(tiré d'une recherche sur Google)

Maintenant qu'il me semblait avoir mieux compris le xpath, pour capter
l'élément 'cite', il me faut

my $cite = $driver->find_element("//cite[\@role='text']"); # j'ai
essayé en quotant avec "" ou '' selon, ça marche pas mieux

ou bien pour récupérer TOUS les 'cite'

my $site = $driver->find_elements("//cite");

Les deux me retournent des valeurs vides (Selenium ne trouve rien). Le
seul truc qui fonctionne est

my $div = $driver->find_elements("div");

qui me retourne bien toute la page et en parsant les enfants, je
trouve ma classe. Mais bof la perf...

Notez que

my $div = $driver->find_elements("//div");

qui est censé fonctionner me retourne aussi une valeur vide...

Du coup, je ne comprends pas bien comment faire (disons, comment
optimiser un peu mon code, car sur une pleine page de google, ça peut
faire dix secondes sur mon pécé antédiluvien pour parser l'arbre
entier). J'ai l'impression que passer un xpath ne fonctionne pas. Et
les autres syntaxes non plus, comme
$driver->find_element('cite[@role="text"]', "css");

Je dois faire une énorme boulette, mais je ne vois vraiment pas. Le
reste de mon code fonctionne, puisque lorsque je mets le div, cela
fonctionne. Je l'utilise par ailleurs à d'autres endroits, pour les
boutons, et cela fonctionne aussi.

Le jeu. 25 avr. 2024 à 03:03, Alex Garel <alex at garel.org> a écrit :
>
>
> Le 24/04/2024 à 09:24, Patrice Karatchentzeff a écrit :
>
> ...
> Par exemple, tiré d'une page de recherche Google (qui fait tout pour
> rendre son code source imparsable)
>
> <h3 aria-hidden="true"><div class="GNJvt ipz2Oe"><span
> class="kQdGHd"><span class="OTvAmd z1asCe QFl0Ff"><svg
> focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24
> 24"><path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6
> 6-6z"></path></svg></span></span><span class="RVQdVd">Plus de
> résultats</span></div></h3>
>
> Je veux sélection h3 aria-hidden="true" pour pouvoir ensuite récupérer
> l'enfant span « Plus de résultats ».
>
> Je sais sélectionner tous les h3, pas ceux avec cette propriété
> seulement. J'ai essayé
>
> $driver->find_elements("//h3[aria-hiden='true']")
>
> Vu que la doc dit que find_elements prend du XPath par défaut. https://metacpan.org/pod/Selenium::Remote::Driver#find_elements
>
> Je suppose que c'est du XPath que tu veux faire, mais dans ce cas il faut un @ devant le nom de ta propriété, et il faut deux "d" à hidden
>
> $driver->find_elements('//h3[@aria-hidden="true"]')
>
> J'ai mis des '' en extérieur de l'expression pour éviter à avoir à banaliser le @
>
> Tu peux tester le XPath dans la console de firefox en utilisant $x("//expression-xpath")
>
> Si je comprends bien la doc, tu peux aussi aller sur du CSS si tu es plus à l'aise (et là c'est $$() dans la console firexfox):
>
> $driver->find_elements('h3[aria-hidden="true"]', "css")
>
> Je te laisse tester et voir si ça marche :-)
>
> ++Alex
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl
> Attention, les archives sont publiques



-- 
      |\      _,,,---,,_           Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff at gmail.com
     |,4-  ) )-,_. ,\ (  `'-'
    '---''(_/--'  `-'\_)


Plus d'informations sur la liste de diffusion Perl