Como posso ter certeza se alguns elementos HTML são carregados para o Selenium+Python?




dom selenium-webdriver (2)

De acordo com seus testes de código, você está usando o ChromeDriver e o Chrome Browser para automatizar as etapas. Como você configurou set_page_load_timeout(10) a exceção de timeout é levantada porque a página não foi completamente carregada dentro do período de tempo configurado através de set_page_load_timeout() . Mas como você print(self.page_source) os elementos renderizados dentro do HTML DOM parcialmente renderizado são recuperados.

Agora, sobre suas consultas individuais:

  • How can I make sure some elements are already loaded? Um testcase ideal teria um passo definido, por exemplo, validar a presença de um elemento, validar a visibilidade de um elemento ou validar a interatividade (enquanto clica) do elemento. A partir dessa perspectiva, verificar se os elementos já estão carregados pode não incluir o elemento desejado. Portanto, em vez de um critério de pesquisa tão amplo, você precisa restringir seus critérios de pesquisa a alguma coisa definida, por exemplo:

    • Título da página
    • Cabeçalho da Página
    • Presença de um alerta
    • Atributo de um elemento
    • Presença de um elemento
    • Presença de um grupo de elementos
    • Visibilidade de um elemento
    • Visibilidade de um grupo de elementos
    • Clickablity de um elemento
    • Staleness Off de um elemento
    • FrameToBeAvailableAndSwitchToIt

A implementação desses critérios de pesquisa restritos pode economizar muito tempo de execução com a ajuda do WebDriverWait incompatível com as expected_conditions .

  • How can I make sure all elements are loaded? Novamente, nossos testes devem ser focados apenas no elemento / elementos com os quais precisamos interagir e deixar de verificar o status / condição de outros elementos que não são de nosso interesse.

  • Agora, seguindo os dois pontos mencionados acima, estes são os 3 mais utilizados:

    • presence_of_element_located : uma expectativa para verificar se um elemento está presente no DOM de uma página. Isso não significa necessariamente que o elemento esteja visível.
    • visibility_of_element_located : uma expectativa para verificar se um elemento está presente no DOM de uma página e visível. Visibilidade significa que o elemento não é exibido apenas, mas também possui altura e largura maiores que 0.
    • element_to_be_clickable : Uma Expectativa para verificar um elemento é visível e ativada de forma que você possa clicar nele.
  • De acordo com o usecase que você mencionou, você pode fazer uma lista de todos os elementos <th> visíveis dentro da árvore DOM, enquanto espera por um período configurável de tempo induzindo WebDriverWait da seguinte forma:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC 
    
    headerList = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='fth1_' and @id='fth1_']/thead/tr//th")))

Nota : O xpath usado nesta ilustração é um xpath de amostra usado apenas para fins de demonstração.

A partir deste link, presumo que o DOM deve ser carregado como um todo no início na RAM.

Como o DOM funciona / é carregado? (em HTML)

Mas então eu testei no Selenium com uma exceção de timeout. Parece que até mesmo a exceção timeout é levantada, alguns elementos já podem ser encontrados, portanto, não é um objeto vazio.

Mas eu estou querendo saber, como posso ter certeza de que alguns elementos já estão carregados? Por exemplo, o exemplo HTML, como posso ter certeza de que todos os elementos <th> estão carregados? Dado o fato de que eu realmente não sei o número dos elementos <th> .

Julgamento de código:

driver = webdriver.Chrome()
driver.set_page_load_timeout(10)
try:
    driver.get(url)
    print('load success!')
except TimeoutException:
    print(self.page_source)

HTML de amostra:

<table width="910" border="0" cellpadding="3" cellspacing="0" id="fth1_" class="fth1_" style="display: none; position: fixed; top: 29px; left: 99px;">
     <thead style="background-color: rgb(233, 233, 233);">
        <tr align="center">
           <th id="f13" style="width: 121px;"><a href="t/?i=614&amp;o=1">Symbol</a></th>
           <th id="f13" style="width: 267px;"><a href="t/?i=614&amp;o=2">Name</a></th>
        </tr>
     </thead>
</table>

Eu encontrei a resposta, verificando o comportamento de carregamento de HTML.

Basicamente o HTML carrega de cabeça para baixo, dito isso, eu só tenho que verificar se existe algum elemet atrás do elemento, por exemplo, se outro elemento vier depois, apenas verifique se outro elemento é apresentado ou não. Se sim, todos os elementos devem ser carregados.





selenium-webdriver