segment-boneyard / nightmare

A high-level browser automation library.
https://open.segment.com
19.54k stars 1.08k forks source link

How do i click on button when it has the same class name as other buttons with Nightmare Js #1617

Closed amkayondo closed 3 years ago

amkayondo commented 3 years ago

I am trying to use nightmare js to select categories of listing when creating a new post on nextdoor website but I am unable to do so as the buttons have the same class names.

import NT from "nightmare";
import { NEXT_DOOR_URL } from "../Global";

const Nightmare = NT({ show: true });

const data = {
  title: "Tomatoes",
  price: 200,
  description: "ripe red tomates for sell",
};

const { title, price, description } = data;

const PostNextDoorAd = () => {
  return Nightmare.goto("https://nextdoor.com/login/?noredirect=True")
    .viewport(1180, 700)
    .insert(".text-input", "[USER EMAIL]")
    .insert(".password_text_input", "[USER PASSWORD]")
    .click("#signin_button")
    .wait(8000)
    .goto("https://nextdoor.com/for_sale_and_free/")
    .click(".main-column-header-button")
    .click(".maybe-later-link .css-s890sm")
    .click("button.postbox-field-dropdown")
    .wait(3000)
    .click('button.postbox-field-dropdown._1eW-tOzA')
    .wait(2000)
    .click('.postbox-field button.postbox-field-dropdown._1eW-tOzA')
    // .click('*[data-testid="Appliances"]')
    //   '*[data-testid="Appliances"]'
    // "[]"
    // .click('*[data-testid="category-selection-field"]')
    .insert("input.postbox-field-text-input", title)
    .insert("input#price-input", price)
    .insert(
      "textarea.postbox-field-text-input.postbox-field-textarea",
      description
    )
    .catch((error) => {
      console.error("Search failed:", error);
    });
};

export default PostNextDoorAd;

WHAT AM SOLVING 8OjIk

amkayondo commented 3 years ago

solved it in this way

.evaluate(() => {
      const categoryBtn = document.getElementsByClassName(
        "postbox-field-dropdown"
      );
      for (let i = 0; i < categoryBtn.length; i++) {
        if (categoryBtn[i].textContent == "Choose category") {
          const foundBtn = categoryBtn[i];
          return foundBtn.click();
        }
      }
    })