Multithreading with Selenium using Python and Telpot

回眸只為那壹抹淺笑 提交于 2019-12-24 10:24:37

问题


I'm coding my first telegram bot, but now I have to serve multiple user at the same time.

This code it's just a little part, but it should help me to use multithread with selenium

class MessageCounter(telepot.helper.ChatHandler):
    def __init__(self, *args, **kwargs):
        super(MessageCounter, self).__init__(*args, **kwargs)

    def on_chat_message(self, msg):
        content_type, chat_type, chat_id = telepot.glance(msg)
        chat_id = str(chat_id)

        browser = browserSelenium.start_browser(chat_id)
        userIsLogged = igLogin.checkAlreadyLoggedIn(browser, chat_id)
        print(userIsLogged)

TOKEN = "***"

bot = telepot.DelegatorBot(TOKEN, [
    pave_event_space()(
        per_chat_id(), create_open, MessageCounter, timeout=10),
])
MessageLoop(bot).run_as_thread()

while 1:
    time.sleep(10)

when the bot recive any message it starts a selenium session calling this function:

def start_browser(chat_id):
    global browser

    try:
        browser.get('https://www.google.com')
        #igLogin.checkAlreadyLoggedIn(browser)
        #links = telegram.getLinks(24)
        #instagramLikes(browser, links)

    except Exception as e:
        print("type error: " + str(e))
        print('No such session! starting webDivers!')
        sleep(3)

        # CLIENT CONNECTION !!
        chrome_options = Options()
        chrome_options.add_argument('user-data-dir=/home/ale/botTelegram/users/'+ chat_id +'/cookies')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--lang=en')
        print("Starting WebDrivers")
        browser = webdriver.Chrome(options=chrome_options)

        start_browser(chat_id)

    return browser

and then this one check if the user is logged:

def checkAlreadyLoggedIn(browser, chat_id):
    browser.get('https://www.instagram.com/instagram/')
    try:
        WebDriverWait(browser, 5).until(EC.element_to_be_clickable(
            (By.XPATH, instagramClicks.buttonGoToProfile))).click()
        print('User already Logged')
        return True
    except:
        print('User not Logged')
        userLogged = login(browser, chat_id)
        return userLogged

and if the user is not logged it try to log the user in whit username and password

so, basically, when I write at the bot with one account everithing works fine, but if I write to the bot from two different account it opens two browser, but it controll just one.

What I mean it's that for example, one window remain over the google page, and then the other one recive two times the comand, so, even when it has to write the username, it writes the username two times

How can I interract with multiple sessions?


回答1:


WebDriver is not thread-safe. Having said that, if you can serialise access to the underlying driver instance, you can share a reference in more than one thread. This is not advisable. But you can always instantiate one WebDriver instance for each thread.

Ideally the issue of thread-safety isn't in your code but in the actual browser bindings. They all assume there will only be one command at a time (e.g. like a real user). But on the other hand you can always instantiate one WebDriver instance for each thread which will launch multiple browsing tabs/windows. Till this point it seems your program is perfect.

Now, different threads can be run on same Webdriver, but then the results of the tests would not be what you expect. The reason behind is, when you use multi-threading to run different tests on different tabs/windows a little bit of thread safety coding is required or else the actions you will perform like click() or send_keys() will go to the opened tab/window that is currently having the focus regardless of the thread you expect to be running. Which essentially means all the test will run simultaneously on the same tab/window that has focus but not on the intended tab/window.



来源:https://stackoverflow.com/questions/55198005/multithreading-with-selenium-using-python-and-telpot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!