¿Es posible que WebDriver haga clic en un elemento con un evento de clic del mouse que invoca un archivo JavaScript que incluye un rastreador de prueba?

Esta es una pregunta que tengo que surge de otra pregunta del usuario. Si miras mi respuesta allí, obtendrás algo de contexto para esta pregunta. La URL de la página web a la que voy eshttps: //hotels.ctrip.com/hotel/347422.html? isFull = F # ctm_ref = hod_sr_lst_dl_n_1_8 si quieres comprobarlo tú mismo.

Considere el script de Python Selenium que se encuentra al final de la pregunta. No sucede nada cuando el selenio intenta hacer clic en este elemento:

browser.find_element_by_xpath('//*[@id="cPageBtn"]').click()

Lo mismo con este elemento

browser.find_element_by_xpath('//*[@id="appd_wrap_close"]').click()

Al depurar mi script de selenio para cada elemento, confirmó que el selenio puede encontrar el elemento muy bien; no está oculto, dentro de un iFrame, deshabilitado o cualquier otra rareza que normalmente verifico por acciones fallidas de selenio.

Sin embargo, tiene un evento de clic del mouse que invoca un archivo JavaScript interesante, y en realidad pude acceder a él navegando a la URL que se muestra aquí:

l pasar por encima de la URL se reveló que eshttps: //webresource.c-ctrip.com/ResUnionOnline/R3/float/floating_normal.min.js? 20190306: 2.

Al comienzo del archivo encontré

document.getElementById("ab_testing_tracker") && "abTestValue_Value" != h ? 
document.getElementById("ab_testing_tracker").value

Así que busco (a través del selector CSS en la consola de desarrollo) el HTML de la página web para un elemento con una identificación de"ab_testing_tracker" y estoy menos que sorprendido de que no devuelva nada. Luego, no minifiqué y busqué en el archivo todas las instancias de "ab_testing_tracker". Eso me llevó a este elemento:

document.getElementsByTagName("body")[0].insertAdjacentHTML("afterBegin","<input type='hidden' name='ab_testing_tracker' id='ab_testing_tracker' value='"+h.split("|")[1]+"'>")

Bueno, parece que hay un nodo de entrada oculto insertado en labody del documento para fines de seguimiento de automatización. La búsqueda en Google reveló que el seguimiento de la automatización a menudo se logra al mirar elnavigator.userAgent propiedad y búsqueda de UserAgents que indican automatización. Pero el script está usando un UserAgent legítimo al azar cada vez, así que no creo que el UserAgent sea cómo la detección está encontrando selenio.

Resumen y posibles soluciones alternativas

Selenium no puede hacer clic en ciertos elementos de la página web probablemente debido a las pruebas de seguimiento por parte del sitio web. Hay un par de cosas que pensé para solucionar: ¿tal vez pueda deshabilitar los eventos de clic cuando uso selenio? Esto no sé cómo hacerlo y no pude encontrar una manera después de buscar en línea. Luego, intenté hacer clic en él con un ejecutor de Javascript, pero eso no funcionó.

¿Alguien sabe una forma de sortear el rastreador de prueba y hacer clic en el elemento deseado?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By

# url
url = "https://hotels.ctrip.com/hotel/347422.html?isFull=F#ctm_ref=hod_sr_lst_dl_n_1_8"

# User Agent
User_Agent_List = ["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2",
                   "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
                   "Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)",
                   "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
                   "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2",
                   "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1",
                   "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"]

# Define the related lists
Score = []
Travel_Types = []
Room_Types = []
Travel_Dates = []
Comments = []

DEFINE_PAGE = 10

def next_page():

    current_page = int(browser.find_element_by_css_selector('a.current').text)

    # First, clear the input box
    browser.find_element_by_id("cPageNum").clear()
    print('Clear the input page')

    # Second, input the next page
    nextPage = current_page + 1
    print('Next page ',nextPage)
    browser.find_element_by_id("cPageNum").send_keys(nextPage)

    # Third, press the goto button
    browser.find_element_by_xpath('//*[@id="cPageBtn"]').click()



def scrap_comments():
    """
    It is a function to scrap User comments, Score, Room types, Dates.
    """
    html = browser.page_source
    soup = BeautifulSoup(html, "lxml")
    scores_total = soup.find_all('span', attrs={"class":"n"})
    # We only want [0], [2], [4], ...
    travel_types = soup.find_all('span', attrs={"class":"type"})
    room_types = soup.find_all('a', attrs={"class":"room J_baseroom_link room_link"})
    travel_dates = soup.find_all('span', attrs={"class":"date"})
    comments = soup.find_all('div', attrs={"class":"J_commentDetail"})
    # Save score in the Score list
    for i in range(2,len(scores_total),2):
        Score.append(scores_total[i].string)
    Travel_Types.append(item.text for item in travel_types)
    Room_Types.append(item.text for item in room_types)
    Travel_Dates.append(item.text for item in travel_dates)
    Comments.append(item.text.replace('\n','') for item in comments)

if __name__ == '__main__':

    # Random choose a user-agent
    user_agent = random.choice(User_Agent_List)
    print('User-Agent: ', user_agent)

    # Browser options setting
    options = Options()
    options.add_argument(user_agent)
    options.add_argument("disable-infobars")

    # Open a Firefox browser
    browser = webdriver.Firefox(options=options)
    browser.get(url)


    browser.find_element_by_xpath('//*[@id="appd_wrap_close"]').click()

    page = 1    
    while page <= DEFINE_PAGE:
        scrap_comments()
        next_page()

    browser.close()

Respuestas a la pregunta(1)

Su respuesta a la pregunta