По какому правилу формируются селекторы элементов



  • Вызываю функцию wait_css_visible('div'). Поток завершается ошибкой о том, что не удалось дождаться элемент. Хотя с селектором h3 все работает.



  • @blackhacker Есть ли на странице div?



  • @support Да, причем не один. Тестировал на vk.com. Можно ли как-то задать селектор, указав в нем выбор div, размер и координаты которых больше нуля? Т.е. которые видимы на странице. Ну или на худой конец, выбрать все div, у которых есть атрибут id. Уже все перепробовал, не получается ничего. Пробовал в селекторе указать "*", в половине случаев работает, в половине - ошибка ожидания элемента, когда убрал из кода wait_css_visible, стала возникать такая же ошибка на random_point() - в логе пишет:
    Поток №1 : Поток аварийно завершился с сообщением "Таймаут во время выполнения random point[documentRoot, all *, at 26]"

    Вот код, который использую:

    BASExtended.prototype.randomActivity = function (clicks) {
        BE.callbacks.clicks = clicks;
        //wait_css_visible("div")!
        all((BE.callbacks.clicks ? 'a' : 'body>*')).length()!
        BE.callbacks.el = BE.getRandom(0, _result());
        all((BE.callbacks.clicks ? 'a' : 'body>*')).at(BE.callbacks.el).focus()!
        all((BE.callbacks.clicks ? 'a' : 'body>*')).at(BE.callbacks.el).random_point()!
        move(parseInt(_result().split(",")[0]), parseInt(_result().split(",")[1]))!
        if (BE.callbacks.clicks) {
            click(parseInt(_result().split(",")[0]), parseInt(_result().split(",")[1]))!
            wait_async_load()!
        }
        sleep(BE.getRandom(3000, 7000))!
        if (BE.getRandom(0, 100) < 75) {
            BE.randomActivity(BE.callbacks.clicks);
        } else {
            if (!BE.callbacks.clicks) {
                BE.randomActivity(true);
            }
        }
    };
    

    Кучу времени убил на тесты. В итоге на любое действие пишет таймаут. Даже на получение стиля

    Таймаут во время выполнения style for[documentRoot, all a, at 0]



  • This post is deleted!


  • @blackhacker

    Да, причем не один. Тестировал на vk.com.

    Дело вот в чем, вы ждете первый div, а его не видно.

    Можно ли как-то задать селектор, указав в нем выбор div, размер и координаты которых больше нуля?

    Одним действием нельзя. Нужно делать нестандартную функцию ожидания, которая перебирает все divы и смотрит есть ли среди них видимый.
    http://wiki.bablosoft.com/doku.php?id=ru:how_to_wait_on_certain_event_on_page#нестандартные_функции_ожидания

    Ну или на худой конец, выбрать все div, у которых есть атрибут id.

    Конечно, div#put_element_id_here

    Это не будет работать

    
    if (BE.callbacks.clicks) {
            click(parseInt(_result().split(",")[0]), parseInt(_result().split(",")[1]))!
            wait_async_load()!
        }
    
    

    Нужно так

    
    _if (BE.callbacks.clicks, function(){
            click(parseInt(_result().split(",")[0]), parseInt(_result().split(",")[1]))!
            wait_async_load()!
        })!
    
    

    Про остальной код не знаю, тоже могут быть ошибки.

    Кучу времени убил на тесты. В итоге на любое действие пишет таймаут. Даже на получение стиля

    Если хотите использовать апи, нужно выучить его особенности, это займет много времени.
    Если хотите сделать быстро, юзайте констрктор. Вот готовый код из SiteVisitor который делает тоже самое что вы пытаетесь.

    0_1480438887445_SiteVisitor.png



  • @support нашел баг, из-за чего random_point вызывала ошибку ожидания. Если размер элемента 0х0, то функция не может выполниться. Если возможно, попробуйте пофиксить. Сейчас несколько раз проверял через javascript на элементе, вызывал self.getBoundingClientRect(), и если размеры элемента были нулевыми, получал ошибку.



  • @blackhacker Если возвращать 0,0 это приведет к нежелательным последствиям, вроде клика по нулевым координатам. Там выскакивала js ошибка, это я исправил, но ожидание так и останется.
    Функция random_point обычно используется вместе с кликом или вводом текста, логично ожидать, что элемент должен быть виден для этого(или будет виден потом). Поэтому БАС будет ждать, пока элемент не станет виден. И если через некоторое допустимое время элемент станет видимым - скрипт продолжит работу, нет - вывалиться с таймаутом.



  • @support Возможно, лучшим решением было бы сразу возвращать ошибку, без ожидания? Ведь есть же уже функция "ждать элемент". Или хотя бы можно добавить в БАС функцию получения размера элемента, чтобы не извращаться с костылями через js.



  • @blackhacker

    Возможно, лучшим решением было бы сразу возвращать ошибку, без ожидания?

    Я в этом не уверен. Например, есть модальное окно, которое появляется только нажатия на кнопку 1, и которое содержит кнопку 2, на которую тоже нужно нажать. Модальное окно стает выдным не сразу, а после секундной анимации.

    Если выполнять код
    Нажать на кнопку 1
    Нажать на кнопку 2
    в текущей версии, этот скрипт отработает корректно, даже если ждать появления второй кнопки нужно будет разное время(от 3 до 5 секунд например).

    С предложенными вами изменениями, последовательное нажатие 2 кнопок не будет работать, а еще хуже, будет работать через раз. На форуме сразу появится тема "скрипт в записи работает не так, как в запуске", БАС очень сложный и т.д.((
    А выгода при таком подходе не очень существенная.

    Или хотя бы можно добавить в БАС функцию получения размера элемента.

    Это идея хорошая. Будет. Но я думаю, что, чтобы решить вашу проблему достаточно вызвать проверить существование
    0_1480457213332_isexists.png

    перед вызовом random_point


Log in to reply
 

  • 8
  • 16
  • 5
  • 2
  • 5
  • 6
  • 4
  • 1