it-roy-ru.com

Дождитесь загрузки страницы в Selenium

Как вы заставляете Selenium 2.0 ждать загрузки страницы?

216
karthick kumar

Вы также можете проверить загруженную страницу, используя следующий код

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
124
Imran

Использовать класс WebDriverWait

Также смотрите здесь

Вы можете ожидать, чтобы показать какой-то элемент. что-то вроде в C #:

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));
86
Artem

Если вы установите неявное ожидание драйвера, а затем вызовите метод findElement для элемента, который вы ожидаете увидеть на загруженной странице, WebDriver будет запрашивать этот элемент, пока не найдет элемент или не достигнет значения времени ожидания.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

источник: неявный-ждет

32
Sam

В целом, в Selenium 2.0 веб-драйвер должен возвращать управление вызывающему коду только после того, как определит, что страница загружена. Если это не так, вы можете вызвать waitforelemement, который циклически повторяет вызов findelement до тех пор, пока он не будет найден или не истечет время ожидания (можно установить тайм-аут).

32
Paul Hadfield

Реализация Ruby:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}
21
allenhwkim

Вы можете удалить строку System.out. Это добавлено для целей отладки.

WebDriver driver_;

public void waitForPageLoad() {

    Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            System.out.println("Current Window State       : "
                + String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
            return String
                .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
                .equals("complete");
        }
    });
}
17
QIKHAN

Вы также можете использовать класс: ExpectedConditions для явного ожидания появления элемента на веб-странице, прежде чем вы сможете предпринять какие-либо действия.

Вы можете использовать класс ExpectedConditions, чтобы определить, является ли элемент видимым:

WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));

Смотрите ExpectedConditions class Javadoc для списка всех условий, которые вы можете проверить.

11
TedEd

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

  1. Они не достаточно универсальны - они хотят, чтобы вы знали заранее, что для страницы, на которую вы переходите, будет выполняться какое-то конкретное условие (например, будет отображаться какой-то элемент)

  2. Они открыты для состояния гонки, когда вы используете элемент, который фактически присутствует на старой странице, а также на новой странице.

Вот моя попытка общего решения, которое позволяет избежать этой проблемы (в Python):

Во-первых, общая функция ожидания (используйте WebDriverWait, если хотите, я нахожу их безобразными):

def wait_for(condition_function):
    start_time = time.time()
    while time.time() < start_time + 3:
        if condition_function():
            return True
        else:
            time.sleep(0.1)
    raise Exception('Timeout waiting for {}'.format(condition_function.__name__))

Далее, решение основывается на том факте, что Selenium записывает (внутренний) id-номер для всех элементов на странице, включая элемент <html> верхнего уровня. Когда страница обновляется или загружается, она получает новый HTML-элемент с новым идентификатором.

Итак, если вы хотите нажать на ссылку с текстом "моя ссылка", например:

old_page = browser.find_element_by_tag_name('html')

browser.find_element_by_link_text('my link').click()

def page_has_loaded():
    new_page = browser.find_element_by_tag_name('html')
    return new_page.id != old_page.id

wait_for(page_has_loaded)

Для большего Pythonic, многоразового, универсального помощника, вы можете сделать менеджер контекста:

from contextlib import contextmanager

@contextmanager
def wait_for_page_load(browser):
    old_page = browser.find_element_by_tag_name('html')

    yield

    def page_has_loaded():
        new_page = browser.find_element_by_tag_name('html')
        return new_page.id != old_page.id

    wait_for(page_has_loaded)

И тогда вы можете использовать его практически для любого взаимодействия с Selenium:

with wait_for_page_load(browser):
    browser.find_element_by_link_text('my link').click()

Я считаю, что это пуленепробиваемый! Как вы думаете?

Больше информации в сообщение в блоге об этом здесь

11
hwjp

Кажется, это серьезное ограничение WebDriver. Очевидно, что ожидание элемента не подразумевает загрузку страницы, в частности, DOM может быть полностью собран (состояние готовности), при этом JS все еще выполняется, а CSS и изображения все еще загружаются.

Я считаю, что самое простое решение - установить переменную JS для события onload после того, как все будет инициализировано, проверить и дождаться этой переменной JS в Selenium.

9
sibidiba

Ответ Имрана перефразирован для Java 7:

    WebDriverWait wait = new WebDriverWait(driver, 30);

    wait.until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript(
                "return document.readyState"
            ).equals("complete");
        }
    });
9
Fin

Если вы хотите дождаться загрузки определенного элемента, вы можете использовать метод isDisplayed() для RenderedWebElement:

// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
    // Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
    RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));

    // If results have been returned, the results are displayed in a drop down.
    if (resultsDiv.isDisplayed()) {
      break;
    }
}

(Пример из 5-минутное руководство по началу работы )

9
Tristan

Явное ожидание или условное ожидание в этом ожидании, пока не будет дано это условие.

WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));

Это будет ждать каждого веб-элемента в течение 60 секунд.

Используйте неявное ожидание ожидания каждого элемента на странице до указанного времени.

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

Это будет ждать каждого веб-элемента в течение 60 секунд.

6
Anuj Teotia

Используйте неявное ожидание ожидания каждого элемента на странице до указанного времени.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

это ожидание каждого элемента на странице в течение 30 сек.

Другое ожидание - это явное ожидание или условное ожидание в этом ожидании до получения данного условия.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

В id укажите статический идентификатор элемента, который неуверенно отображается на странице, как только страница загружается.

5
Kuldeep Yadav

Я удивлен, что предикаты не были первым выбором, поскольку вы, как правило, знаете, с какими элементами вы будете взаимодействовать в следующий раз на странице, которую вы ожидаете загрузить. Мой подход всегда заключался в создании предикатов/функций, таких как waitForElementByID(String id) и waitForElemetVisibleByClass(String className), и т.д., А затем использовать и повторно использовать их везде, где они мне нужны, будь то загрузка страницы или изменение содержимого страницы, на котором я жду.

Например,

В моем тестовом классе:

driverWait.until(textIsPresent("expectedText");

В моем тестовом классе родитель:

protected Predicate<WebDriver> textIsPresent(String text){
    final String t = text;
    return new Predicate<WebDriver>(){
        public boolean apply(WebDriver driver){
            return isTextPresent(t);
        }
    };
}

protected boolean isTextPresent(String text){
    return driver.getPageSource().contains(text);
}

Несмотря на то, что это выглядит много, нужно постоянно проверять вас, и интервал между тем, как часто проверять, можно установить вместе с конечным временем ожидания до истечения времени ожидания. Также вы будете повторно использовать такие методы.

В этом примере родительский класс определил и инициировал WebDriver driver и WebDriverWait driverWait.

Надеюсь, это поможет.

4
Jack Mason

NodeJS Решение:

В Nodejs вы можете получить его через обещания ...

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

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

Если вы напишите этот код, вы будете перемещаться, а Selenium будет ждать 3 секунды ...

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

Из документации Selenium:

this.get (url) → затем

Планирует команду для перехода к указанному URL.

Возвращает обещание, которое будет разрешено, когда документ завершит загрузку .

Selenium Documentation (Nodejs)

4
sidanmor

SeleniumWaiter:

import com.google.common.base.Function;
import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.support.ui.WebDriverWait;

public class SeleniumWaiter {

      private WebDriver driver;

      public SeleniumWaiter(WebDriver driver) {
           this.driver = driver;
      }

      public WebElement waitForMe(By locatorname, int timeout){
           WebDriverWait wait = new WebDriverWait(driver, timeout);
           return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
      }

      public static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function<WebDriver, WebElement>() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }

И вам используйте это:

_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}
3
KimiRai23

Вызов ниже функции

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
3
Shubham Jain

Вы можете использовать существующий ниже метод для установки времени для pageeLoadTimeout в следующем примере, если загрузка страницы занимает более 20 секунд, тогда она выдаст исключение перезагрузки страницы

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)
3
Arpan Saini
/**
 * Call this method before an event that will change the page.
 */
private void beforePageLoad() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.mpPageReloaded='notYet';");
}

/**
 * Call this method after an event that will change the page.
 * 
 * @see #beforePageLoad
 * 
 *      Waits for the previous page to disappear.
 */
private void afterPageLoad() throws Exception {
    (new WebDriverWait(driver, 10)).until(new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            Object obj = js.executeScript("return document.mpPageReloaded;");
            if (obj == null) {
                return true;
            }
            String str = (String) obj;
            if (!str.equals("notYet")) {
                return true;
            }
            return false;
        }
    });
}

Вы можете перейти от документа к элементу, если изменяется только часть документа.

Эта техника была вдохновлена ​​ответом frombasic.

3
Marc

Лучший способ дождаться загрузки страницы при использовании привязок Java для WebDriver - это использовать шаблон проектирования Page Object с PageFactory. Это позволяет вам использовать AjaxElementLocatorFactory, чтобы поместить его просто как глобальное ожидание всех ваших элементов. У него есть ограничения на такие элементы, как выпадающие списки или сложные переходы JavaScript, но он значительно сократит объем необходимого кода и ускорит время тестирования. Хороший пример можно найти в этом посте. Базовое понимание Core Java предполагается.

http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html

3
sonhu

Если кто-то использует селенид:

public static final Long SHORT_WAIT = 5000L; // 5 seconds
$("some_css_selector").waitUntil(Condition.appear, SHORT_WAIT);

Дополнительные условия можно найти здесь: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html

2
IKo

Мой простой способ:

long timeOut = 5000;
    long end = System.currentTimeMillis() + timeOut;

        while (System.currentTimeMillis() < end) {

            if (String.valueOf(
                    ((JavascriptExecutor) driver)
                            .executeScript("return document.readyState"))
                    .equals("complete")) {
                break;
            }
        }
2
RichardK

Вы можете использовать ожидание. в Selenium есть 2 типа ожидания

  • Неявное ожидание
  • Явное ожидание

- Неявное ожидание

Это очень просто, смотрите синтаксис ниже:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

- Явное ожидание

Явное ожидание или условное ожидание в этом ожидании, пока не будет выполнено данное условие.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

Вы можете использовать другие свойства, такие как visblityOf(), visblityOfElement()

2
iamsankalp89

В моем случае я использовал следующее, чтобы узнать статус загрузки страницы. В нашем приложении присутствуют gif (ы) загрузки, и я слушаю их следующим образом, чтобы исключить нежелательное время ожидания в скрипте.

public static void processing(){ 
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}

Где xpath находит gif в HTML DOM. После этого Вы также можете реализовать свои методы действий. Нажмите.

public static void click(WebElement elementToBeClicked){
    WebDriverWait wait = new WebDriverWait(driver, 45);
    wait.until(ExpectedConditions.visibilityOf(element));
    wait.until(ExpectedConditions.elementToBeClickable(element)); 
    wait.ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class); elementToBeClicked.click(); 
 }
2
Praveen

Вы можете явно дождаться появления элемента на веб-странице, прежде чем предпринимать какие-либо действия (например, element.click ())

driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
        @Override
        public WebElement apply(WebDriver d) {
        return d.findElement(By.id("myDynamicElement"));
}});

Это то, что я использовал для аналогичного сценария, и он отлично работает.

2
anirus

Вы можете использовать этот фрагмент кода для загрузки страницы:

    IWait wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver,TimeSpan.FromSeconds(30.00));
    wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

Или вы можете использовать официант для любого элемента, который будет загружен и станет видимым/кликабельным на этой странице, скорее всего, который будет загружен в конце загрузки, например:

    Wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpathOfElement));
    var element = GlobalDriver.FindElement(By.XPath(xpathOfElement));
    var isSucceededed = element != null;
1
Mohsin Awan

Вот Java 8 версия текущего наиболее одобренный ответ :

WebDriverWait wait = new WebDriverWait(myDriver, 15);
wait.until(webDriver -> ((JavascriptExecutor) myDriver).executeScript("return document.readyState").toString().equals("complete"));

Где myDriver - это объект WebDriver (объявленный ранее).

Примечание : учтите, что этот метод (document.readyState) проверяет только DOM.

1
Ælis

Лучший способ, который я видел, - это использовать stalenessOf ExpectedCondition, чтобы дождаться устаревания старой страницы.

Пример:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement oldHtml = driver.findElement(By.tagName("html"));
wait.until(ExpectedConditions.stalenessOf(oldHtml));

Он будет ждать десять секунд, пока старый HTML-тег не устареет, а затем выдаст исключение, если этого не произойдет.

1
forresthopkinsa

Я использую node + Selenium-webdriver (сейчас это версия 3.5.0). что я делаю для этого:

var webdriver = require('Selenium-webdriver'),
    driver = new webdriver.Builder().forBrowser('chrome').build();
;
driver.wait(driver.executeScript("return document.readyState").then(state => {
  return state === 'complete';
}))
0
yuwanlin

Для неявного ожидания вы можете использовать что-то вроде следующего:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)

Для того, чтобы веб-страница ожидала, пока конкретный объект не станет видимым, или определенное условие будет истинным. Вы можете использовать перо ожидания веб-драйвера.

//120 is maximum number of seconds to wait.
WebDriverWait wait = new WebDriverWait(driver,120);  
wait.until(ExpectedConditions.elementToBeClickable("CONDITITON"));

В Java, другой вариант - перевести нить в режим ожидания в течение определенного времени.

Thread.sleep(numberOfSeconds*1000); 
//This line will cause thread to sleep for seconds as variable

Я создал метод, чтобы упростить метод thread.sleep

public static void wait_time(int seconds){
    try {
        Thread.sleep(seconds*1000);
        }catch (InterruptedException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

Используйте метод как wait_time (10); Поток будет спать 10 секунд.

0
MMSA

Как заставить Selenium ждать загрузки страницы после клика обеспечивает следующий интересный подход:

  1. Сохраните ссылку на WebElement со старой страницы.
  2. Нажмите на ссылку.
  3. Продолжайте вызывать операции для WebElement до тех пор, пока не будет выбрано StaleElementReferenceException.

Образец кода:

WebElement link = ...;
link.click();
new WebDriverWait(webDriver, timeout).until((org.openqa.Selenium.WebDriver input) ->
{
    try
    {
        link.isDisplayed();
        return false;
    }
    catch (StaleElementReferenceException unused)
    {
        return true;
    }
});
0
Gili
private static void checkPageIsReady(WebDriver driver) {
    JavascriptExecutor js = (JavascriptExecutor) driver;

    // Initially bellow given if condition will check ready state of page.
    if (js.executeScript("return document.readyState").toString().equals("complete")) {
        System.out.println("Page Is loaded.");
        return;
    }

    // This loop will rotate for 25 times to check If page Is ready after
    // every 1 second.
    // You can replace your value with 25 If you wants to Increase or
    // decrease wait time.
    for (int i = 0; i < 25; i++) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        // To check page ready state.
        if (js.executeScript("return document.readyState").toString().equals("complete")) {
            break;
        }
    }
}
0
Prasobh.K
public static int counter = 0;

public void stepGeneralWait() {

    boolean breakIt = true;

    while (true) {
        breakIt = true;
        try {

            do{
                // here put e.g. your spinner ID
                Controller.driver.findElement(By.xpath("//*[@id='static']/div[8]/img")).click();
                Thread.sleep(10000);

                counter++;

                if (counter > 3){
                    breakIt = false;

                }
            }
            while (breakIt);



        } catch (Exception e) {
            if (e.getMessage().contains("element is not attached")) {
                breakIt = false;
            }
        }
        if (breakIt) {
            break;
        }

    }

    try {
        Thread.sleep(12000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
0
Firas Al-Barghouthi

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

public void waitForBrowserToLoadCompletely() {
    String state = null;
    String oldstate = null;
    try {
        System.out.print("Waiting for browser loading to complete");

        int i = 0;
        while (i < 5) {
            Thread.sleep(1000);
            state = ((JavascriptExecutor) driver).executeScript("return document.readyState;").toString();
            System.out.print("." + Character.toUpperCase(state.charAt(0)) + ".");
            if (state.equals("interactive") || state.equals("loading"))
                break;
            /*
             * If browser in 'complete' state since last X seconds. Return.
             */

            if (i == 1 && state.equals("complete")) {
                System.out.println();
                return;
            }
            i++;
        }
        i = 0;
        oldstate = null;
        Thread.sleep(2000);

        /*
         * Now wait for state to become complete
         */
        while (true) {
            state = ((JavascriptExecutor) driver).executeScript("return document.readyState;").toString();
            System.out.print("." + state.charAt(0) + ".");
            if (state.equals("complete"))
                break;

            if (state.equals(oldstate))
                i++;
            else
                i = 0;
            /*
             * If browser state is same (loading/interactive) since last 60
             * secs. Refresh the page.
             */
            if (i == 15 && state.equals("loading")) {
                System.out.println("\nBrowser in " + state + " state since last 60 secs. So refreshing browser.");
                driver.navigate().refresh();
                System.out.print("Waiting for browser loading to complete");
                i = 0;
            } else if (i == 6 && state.equals("interactive")) {
                System.out.println(
                        "\nBrowser in " + state + " state since last 30 secs. So starting with execution.");
                return;
            }

            Thread.sleep(4000);
            oldstate = state;

        }
        System.out.println();

    } catch (InterruptedException ie) {
        ie.printStackTrace();
    }
}
0
ANarula

Самый простой способ - просто подождать какой-нибудь элемент, который появится на загруженной странице.

Если вы хотите нажать какую-либо кнопку уже после загрузки страницы, вы можете использовать await и нажать:

await().until().at.most(20, TimeUnit.Seconds).some_element.isDisplayed(); // or another condition
getDriver().find(some_element).click;
0
Michau

используйте следующий код, это очень легко и просто для загрузки страницы.

public void PageLoad(IWebDriver driver, By by)
{
    try
    {
        Console.WriteLine("PageLoad" + by);
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
        wait.Until(ExpectedConditions.ElementIsVisible(by));
        wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); // 30 seconds wait until element not found. 
        wait.Until(ExpectedConditions.ElementToBeClickable(by));


    }
    catch (Exception ex)
    {

        Console.WriteLine(ex.Message);
        Assert.Fail("Element not found!")
    }
}

я надеюсь, это поможет вам.

0
Neel Gurbani
  1. WebDriver driver = new ff / chrome / anyDriverYouWish(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); Ожидает максимум 10 секунд.

  2. WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.visibilityOf(WebElement element));

  3. FluentWait<Driver> fluentWait; fluentWait = new FluentWait<>(driver).withTimeout(30, TimeUnit.SECONDS) .pollingEvery(200, TimeUnit.MILLISECONDS) .ignoring(NoSuchElementException.class);

Преимущество последнего варианта в том, что вы можете включить ожидаемое исключение, чтобы ваше выполнение продолжалось.

0
Vinod Kumar K V
driver.asserts().assertElementFound("Page was not loaded",
By.xpath("//div[@id='actionsContainer']"),Constants.LOOKUP_TIMEOUT);
0
Ran Adler

использовать условие if и для любого из присутствующих элементов

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
0
iam_muqshid