1
votes

Comment localiser et cliquer sur l'élément textarea à l'aide de Selenium et Python

J'utilise Selenium avec python et j'ai essayé de cliquer sur une zone de texte et de saisir un message. Le code HTML de la zone de texte ressemble à ceci:

time.sleep(3)
input_box = browser.find_element_by_css_selector(".textarea")
input_box.click()
for ch in message:
    input_box.send_keys(ch)
input_box.send_keys(Keys.ENTER)

J'ai essayé de le sélectionner par sélecteur css avec ce code:

<div class="tw-block tw-border-radius-large tw-pd-0">
    <div class="tw-relative">
        <div class="chat-input__textarea">
            <textarea data-a-target="chat-input" data-test-selector="chat-input" class="tw-block tw- 
            border-radius-medium tw-font-size-6 tw-full-width tw-textarea tw-textarea--no-resize" 
            autocomplete="Messenger-chat" maxlength="500" placeholder="Send a message" rows="1" 
            style="padding-right: 3.5rem;"></textarea>
        </div>
     </div>
</div>

Il garde me donnant un NoSuchElement. Comme vous pouvez le voir, je ne sais pas vraiment ce que je fais vraiment - aidez s'il vous plaît merci :)


0 commentaires

3 Réponses :


1
votes

.texarea ne va trouver aucun élément:

. indique que le sélecteur doit rechercher la valeur de poursuite dans le className code > d'un élément.

Donc, vous dites au sélecteur de rechercher un élément avec className textarea.

Vous confondez className sélecteur avec un sélecteur tagname . Si vous voulez l'obtenir par nom de variable, utilisez simplement le nom de variable sans point (.), Donc:

find_element_by_css_selector("textarea.tw-block.tw- 
        border-radius-medium.tw-font-size-6.tw-full-width.tw-textarea.tw-textarea--no-resize")

Cela renverrait le premier élément textarea qu'il trouve, ce qui peut ou peut ne pas être ce que vous voulez. Pour le rendre plus précis, vous pouvez faire:

find_element_by_css_selector("textarea") 

Remarquez comment dans la deuxième version il y a plusieurs points (.) Dans le sélecteur, indiquant au moteur de rechercher un élément de tagname textarea avec classNames : tw-block tw- border-radius-medium tw-font-size-6 tw-full-width tw-textarea tw-textarea - pas de redimensionnement . Chaque nom de classe individuel est séparé par un espace dans le balisage Html , vous utilisez donc un point (.) Pour indiquer au sélecteur de chaîner ces noms de classe ensemble.

Si par hasard vous avez plusieurs zones de texte avec tous les mêmes classNames que ci-dessus, vous auriez besoin de trouver une sorte d'identifiant unique pour la zone de texte que vous voulez. Le sélecteur fourni par KunduK en est un bon exemple.

Ce lien vous aidera peut-être à en savoir plus sur les sélecteurs css: ( https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors )


0 commentaires

0
votes

Votre sélecteur css est erroné .textarea dans le sélecteur css identifiez le nom de la classe .

Essayez ci-dessous le sélecteur css . p >

input_box = browser.find_element_by_css_selector("textarea[data-a-target='chat-input']")


0 commentaires

1
votes

Selon le HTML, l'élément est un élément . Donc, pour identifier l'élément, le code pertinent aurait été l'un des suivants:

  • browser.find_element_by_tag_name("textarea")
  • browser.find_element_by_css_selector("textarea[attribute_name='attribute_value'letter")

Solution

Idéalement, pour identifier et cliquer dans l'élément souhaité, vous devez induire WebDriverWait pour le element_to_be_clickable () et vous pouvez utiliser l'une des Stratégies de localisation : p>

  • Utilisation de CSS_SELECTOR :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Utilisation de XPATH :

    input_box = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//textarea[@data-a-target='chat-input' and @data-test-selector='chat-input'][@placeholder='Send a message']")))
    input_box.click()
    
  • Remarque : vous devez ajouter les importations suivantes:

    input_box = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "textarea[data-a-target='chat-input'][data-test-selector='chat-input'][placeholder='Send a message']")))
    input_box.click()
    


0 commentaires