Что случилось с вызовом Вызывают, независимо от InvokeRequired?

Вам не хватает инициализации PageFactory, поэтому вы получаете NullPointerException вместо NoSuchElementException

Добавить конструктор так:

public class tableTestStepDefs {

@FindBy(how = How.XPATH, using = "//*[@id=\"contenido-table\"]/tbody/tr[1]/td[3]")
public WebElement cell1;
@FindBy(how = How.ID, using = "\"DTE_Field_sufijo\"")
public WebElement editableCell1;

public tableTestStepDefs() { //this!
    PageFactory.initElements(driver, this);
}

@When("^i click on cell1 to make it editable$")
public void hagoClickEnUnaCeldaDeLaColumnaSufijo(){
driver.get("http://192.168.242.104:7777/some/context");
cell1.click();
}
38
задан Community 23 May 2017 в 12:19
поделиться

5 ответов

Из потоков, не относящихся к пользовательскому интерфейсу, мы не можем касаться пользовательского интерфейса - могут случиться очень плохие вещи, поскольку элементы управления имеют сходство с потоками , Поэтому из потока, не являющегося пользовательским интерфейсом, мы должны (как минимум) вызвать Invoke или BeginInvoke .

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

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

30
ответ дан Marc Gravell 27 November 2019 в 03:54
поделиться

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

3
ответ дан Brian Rasmussen 27 November 2019 в 03:54
поделиться

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

InvokeRequired проверяет идентичность текущего исполняющего потока и идентичность создаваемого потока. Если они одинаковы, код может свободно взаимодействовать с элементом управления. Если нет, код должен перенаправить данные из текущего потока в поток создания экземпляра. Это медленный и дорогостоящий процесс, и его следует избегать, если это вообще возможно. Ваш код будет работать, если вы всегда вызываете, и может случиться так, что вы не заметите снижения производительности, но этот сценарий будет становиться все более распространенным по мере использования многоядерных систем. Лучше не создавать кодовые «узлы», которые должны быть отменены позже.

1
ответ дан JonStonecash 27 November 2019 в 03:54
поделиться

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

0
ответ дан user88637 27 November 2019 в 03:54
поделиться

Invoke собирается вызывать код через Delegate, а не напрямую, что будет дорогостоящим.

Экономически выгодно вызывать Invoke только тогда, когда это требуется. Следовательно, InvokeRequired используется для выяснения, выполняется ли вызов из того же потока или другого потока?

0
ответ дан NileshChauhan 27 November 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: