Hello, I'm having some troubles while testing my odoo app with playright.
I often find playwright clicking too fast for elements to be activated already, or to modify a field, then try to do something else immediatly, only to see that something be canceled by an "actualisation" of the page, caused by the previous field modification.
It seems that I am not allowed to post images, so i have to describe the situation with words.
For an exemple of the first case, i choose the value "Assurance axa" in a dropdown, and i must then empty the field, but if i do it like this.
await odoo.try_to_select_x2m("Assurance axa", "source_service_line_id")
await odoo.empty_field("source_service_line_id")
It chooses the value, then empty the field immediately, but then the field gets 'actualized', and the field retakes the value "Assurance axa".
So far i make the test pass like this
await odoo.try_to_select_x2m("Assurance axa", "source_service_line_id")
await odoo.wait_for_http_response_with_url_substring("lease4.amendment.service_line") // Need to be addressed differently
await odoo.empty_field("source_service_line_id")
async wait_for_http_response_with_url_substring(url_substring) {
await this.page.waitForResponse(response => response.url().includes(url_substring));
await this.page.waitForTimeout(500) // To let the page update after receiving its response.
}
but as you can see, it is not even enough to wait for the associated http response, i have to add a timeout, and this is not viable long-term.
For my second exemple, first i have my login function
async login(username: string) {
let password = await this.get_password_from_vault(username)
await this.page.goto('***********************');
await this.page.waitForResponse(response => response.url().includes('web.assets_frontend_lazy.js'))
await this.page.getByLabel('Your Email').fill(username)
await this.page.getByLabel('Password').fill(password)
await this.page.getByRole('button', {name: 'Confirm'}).click()
await this.page.waitForURL(/active_id=mail\.box_inbox/)
}
where i have to wait for the page to be hydrated ( i think that it is what the lazy.js http response indicates ) before clicking on the 'Confirm' button.
I have been told by a more experienced colleague to avoid waitForResponse as much as possible, and for obvious reasons not to have any waitForTimeout, but i don't see how to handle these situations differently.
For my second problem, i have this code
await odoo.navigate("CRM", "Sales", "My Pipeline")
await odoo.wait_for_http_response_with_url_substring("crm.lead")
await odoo.click_on_button_by_accessible_name_or_data_name('Create')
that only works thanks to the timeout, if i try to do
await odoo.navigate("CRM", "Sales", "My Pipeline")
await odoo.wait_for_url("model=crm.lead&view_type=kanban")
await odoo.click_on_button_by_accessible_name_or_data_name('Create')
then playwright clicks on the button, but nothing happens, and yet i don't see any javascript in the http requests that could indicates a lazy loading/hydration of the button, but the button works fine if i wait 500 ms.
I'm quite confused about why this button isn't "activated", but i have to wait a bit before being able to use it.
Anyways, i would appreciate any idea on how to handle these situations without using this waitForResponse function.
Thank you for reading all this, have a good day.